С++ обрабатывать как HWND?


Мне интересно, можно ли преобразовать дескриптор окна в "HWND". Мне нужно вызвать функцию "PostMessage" с помощью метода "FindWindow".

В настоящее время я должен получить

HANDLE mainProcess;
BOOL APIENTRY ATTACH_PROCESS(int ProcessID)
{

    mainProcess = OpenProcess(PROCESS_ALL_ACCESS, true, ProcessID);

    return TRUE;
}
BOOL APIENTRY SEND_INPUT(/*NOT USED FOR THIS SAMPLE*/ const char* String, bool Keydown)
{

    int ToDo = WM_KEYUP;
    if (Keydown)
        ToDo = WM_KEYDOWN;
    return PostMessage((HWND)mainProcess, ToDo, VK_TAB, NULL); 
}

person Rasmus Søborg    schedule 03.05.2012    source источник
comment
Нет. Есть причина, по которой существуют два разных типа данных (HANDLE и HWND) для дескрипторов процессов и дескрипторов окон. Не говоря уже о том, что у процесса может быть более одного окна, так что однозначного соответствия точно нет. Что вы на самом деле пытаетесь сделать?   -  person In silico    schedule 03.05.2012
comment
Я пытаюсь сделать простой в использовании API для создания бота World of Warcraft. Окно HWND, которое я пытаюсь найти, является HWND главного окна. Я не знаю, смогу ли я найти это :S Однако; Это не большая проблема, я просто обучаюсь C++.   -  person Rasmus Søborg    schedule 03.05.2012


Ответы (2)


вызовите GetProcessId(), используя дескриптор mainProcess, чтобы получить ProcessID.

вызвать EnumWindows()

Для каждого окна вызовите GetWindowThreadProcessId(), чтобы получить ProcessId процесса, связанного с окном.

Сравните ProcessID, если они совпадают — вы нашли нужный HWND.

Это довольно затратная задача, поэтому лучше заранее найти нужный hwnd и просто сохранить его.

person MessyHack    schedule 03.05.2012
comment
Предупреждение. Как упоминалось ранее, процесс может иметь несколько окон, поэтому вам может потребоваться дополнительная проверка окна (имя класса, заголовок и т. д.), чтобы определить, является ли оно тем, которое вам нужно. - person MessyHack; 03.05.2012
comment
Благодаря вам обоим у меня появилась идея решить эту проблему :]. - person Rasmus Søborg; 03.05.2012

Нет. Процесс может создавать несколько окон. Поскольку не существует отображения 1-к-1, такая функция не имеет смысла.

С другой стороны, вполне возможно иметь функцию, которая возвращает список окон, созданных процессом.

person Mike Kwan    schedule 03.05.2012