我正在尝试编写一个程序,可以获取进程的窗口标题。 在我描述问题之前,这是代码:
#include <Windows.h>
#include <string>
#include <Psapi.h>
#include <algorithm>
std::string window_title;
std::string search_for;
BOOL CALLBACK EnumWindowCallback(HWND hWindow, LPARAM param)
{
if ( IsWindow( hWindow ) == TRUE )
{
DWORD pid = 0;
if ( GetWindowThreadProcessId( hWindow, &pid ) != 0 )
{
HANDLE hProcess;
hProcess = OpenProcess( PROCESS_ALL_ACCESS, FALSE, pid );
if ( hProcess != 0 )
{
std::string path;
CHAR name[MAX_PATH];
GetModuleFileNameExA( hProcess, NULL, name, sizeof(name) / sizeof(CHAR) );
path = name;
unsigned int slash = path.find_last_of('\\');
if ( slash != std::string::npos ){
std::string proc_name = path.substr( slash + 1, path.length() );
std::transform(proc_name.begin(), proc_name.end(), proc_name.begin(), ::tolower);
if ( proc_name == search_for )
{
CHAR finalTitle[MAX_PATH];
ZeroMemory( finalTitle, sizeof(finalTitle) );
SendMessageA( hWindow, WM_GETTEXT, (WPARAM)sizeof(CHAR)/sizeof(MAX_PATH), (LPARAM)finalTitle );
window_title = finalTitle;
return FALSE;
}
}
}
}
}
return TRUE;
};
const char* __stdcall GetWinTitleByProcessName( const char* title )
{
search_for = title;
std::transform(search_for.begin(), search_for.end(), search_for.begin(), ::tolower);
if ( EnumWindows( (WNDENUMPROC)EnumWindowCallback, 0 ) == FALSE )
{
return window_title.c_str();
}
return "NOTFOUND";
}
int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
MessageBoxA( NULL, GetWinTitleByProcessName("chrome.exe"), "Test", MB_OK);
}
该程序目前可以正常运行,但当我需要获取窗口的实际标题时就会出现问题。我尝试使用GetWindowText和SendMessage方法,如下所示。但两种方法都返回空字符串。 我应该如何获取窗口标题?
char
和SendMessageA
替换为wchar_t
和SendMessageW
。确保你的项目中定义了UNICODE
符号。 - Cody GrayCreateWindowW
创建的窗口上调用SendMessageA
,则可能会失败。请调用IsWindowUnicode
并使用适当的SendMessageA
/W
变体。 - IInspectableRegisterClass
确定窗口的字符集。尽管我找不到任何官方文档,但似乎没有进行任何翻译。 @None 您是否尝试过使用GetWindowText
而不是发送WM_GETTEXT
消息? - IInspectable