Мне нужно получить прямоугольник определенного виджета страницы в Chrome, поэтому я использовал SetWindowsHookEx. И когда я получаю hwnd конкретной страницы через название заголовка, получаю идентификатор процесса и потока и использую SetWindowsHookEx, чтобы захватить ее прямоугольник, показать окно сообщения и записать в файл. Но что меня смущает, так это две вещи.
Когда у меня действительно есть имя виджета как «Google - Google Chrome», все виджеты в Chrome, когда я перемещаю каждый из них, показывает окно сообщения, и мой файл записывается прямо.
(Виджет, я не знаю, как его четко описать, у одного виджета много страниц, у хрома много виджетов, один виджет - один процесс)
Когда у меня нет виджета с именем «Google - Google Chrome», там pid и tid равны 0, но когда я перемещаю любой виджет, там отображается окно сообщения, и мой файл был записан. Как показывает msdn, если tid равен нулю, все 64-битные программы должны выполнять все действия.
int main()
{
std::cout << "hi" << std::endl;
HMODULE hdll = LoadLibrary(L"Dll1.dll");
HOOKPROC hproc = (HOOKPROC)GetProcAddress(hdll, "CallWndRefProc");
int a = GetLastError();
std::cout <<"error: "<< a << std::endl;
HWND hwnd=FindWindow(NULL, L"ssss - Google Chrome");
DWORD pid = 0;
DWORD tid = GetWindowThreadProcessId(hwnd, &pid);
HHOOK hook = SetWindowsHookEx(WH_CBT, hproc, hdll, tid);
std::cout << "Hello World!\n";
//for (int i = 0; i < 800; i++) {
// Sleep(2000);
//}
UnhookWindowsHookEx(hook);
return 0;
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
LRESULT CALLBACK CallWndRefProc(__in int nCode, __in WPARAM wParam, __in LPARAM lParam)
{
if (NULL != lParam) {
if (nCode == HCBT_MOVESIZE) {
RECT *rect = (RECT *)lParam;
MessageBox(NULL, TEXT(""), TEXT("Tips"), MB_OK);
FILE *file;
fopen_s(&file, "F:\\hooklog.txt", "a+");
fprintf(file, "Move or size (%d, %d, %d, %d) for target window.\n", rect->left, rect->right, rect->top, rect->bottom);
fprintf(file, "lParam(%d)", wParam);
fclose(file);
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Теперь я обнаружил, что в первом случае я пытаюсь создать два wdiget в chrome, но его pid и tid одинаковы? Зачем? Если их pid одинаковы, почему в моем диспетчере задач много хрома?
И в случае 2 я обнаружил, что мой IDE-VS2017 не выполняет никаких действий, потому что он 32-разрядный. Но FireFox и Chrome все имеют такое действие, так что это объясняет это.
Теперь все ли виджеты в Chrome имеют один pid и tid? они все в одном процессе? В таком случае, как я могу получить прямоугольник определенного виджета?