프로세스의 창 제목을 얻을 수있는 프로그램을 작성하려고합니다. 내가 문제를 설명하기 전에, 여기에 코드입니다 : 나는 윈도우의 실제 제목을 취득 할 때까지이 프로그램은 지금까지 작동프로세스 이름에서 창 제목 얻기
#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
유니 코드 문자열 대신 ANSI 문자열을 사용하는 이유는 무엇입니까? 2013 년, 모든 Windows 프로그램은 완전히 유니 코드 여야합니다. 'char'와'SendMessageA'를'wchar_t'와'SendMessageW'로 대체하십시오. 프로젝트에'UNICODE' 심볼이 정의되어 있는지 확인하십시오. –
최종 결과는 wchar_t를 인식하지 못하는 고대 스크립팅 언어로 내보내지기 때문에 char에 있어야하기 때문에. – DeleteMe