Я пытаюсь написать программу, которая может получить заголовок окна процесса. Перед тем, как описать проблему, вот код:Получение заголовка окна из имени процесса
#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, как показано здесь. Оба метода возвращают пустые строки.
Как я могу получить заголовок окна?
Я посетил этот вопрос: http://stackoverflow.com/questions/7063316/getwindowtext-returning-empty-string-and-strange-error Но на самом деле он не содержит решения, которое удовлетворяет моему вопросу. – DeleteMe
Это также NoneOfMyBusiness, почему вы используете строки ANSI, а не строки Unicode? Это 2013 год, все программы для Windows должны быть полностью Unicode. Замените 'char' и' SendMessageA' на 'wchar_t' и' SendMessageW'. Убедитесь, что для вашего проекта определен символ UNICODE. –
Поскольку конечный результат должен быть в char, потому что он экспортируется на древний язык сценариев, который не понимает wchar_t. – DeleteMe