Я пытаюсь украсть окно с экрана и сделать его дочерним для моего собственного созданного окна. Когда моя программа закрывается, украденное окно тоже исчезает, возможно, вместе со своим процессом.
Вот мои вопросы:
Вот'код, который я использовал (Win32 Console Application):
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
#include <winuser.h>
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LPCWSTR sClassName = L"MyClass";
HWND CreateTheWindow(LPCWSTR WindowTitle) {
// Create & register the class
WNDCLASSEX WndClass;
WndClass.cbSize = sizeof(WNDCLASSEX); WndClass.style = NULL; WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.lpszClassName = sClassName;
WndClass.hInstance = NULL; WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
WndClass.lpszMenuName = NULL; WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
RegisterClassEx(&WndClass);
// Create & show the window
HWND hwnd = CreateWindowEx(WS_EX_STATICEDGE, sClassName, WindowTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, 320, 240, NULL, NULL, NULL, NULL);
ShowWindow(hwnd, SW_SHOW); UpdateWindow(hwnd);
return hwnd;
}
// No idea what's this for, back in JS we simply had to do window.open
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
switch(Message) {
case WM_CLOSE: DestroyWindow(hwnd); break;
case WM_DESTROY: PostQuitMessage(0); break;
default: return DefWindowProc(hwnd, Message, wParam, lParam);
}
return 0;
}
// start
void main()
{
HWND chrome = FindWindow(L"Chrome_WidgetWin_1", NULL);
HWND mywin = CreateTheWindow(L"HELLO BOSS");
if(chrome!=0) printf("Got Chrome\r\n"); else printf("Chrome not found\r\n");
if(mywin!=0) printf("Got yours\r\n"); else printf("Your window not found\r\n");
SetParent(chrome, mywin);
SetWindowLong(chrome, GWL_STYLE, WS_CHILDWINDOW | WS_VISIBLE );
UpdateWindow(chrome);
UpdateWindow(mywin);
_getch();
}
О BTW, пожалуйста, не спрашивайте меня, чего я'пытаюсь достичь :D Это'сюрприз.
Похоже, что вы не запускаете цикл сообщений, который необходим для вашего собственного окна и, вероятно, необходим для перекачки сообщений, которые идут между дочерним и родительским окнами. Это кажется наиболее вероятной причиной того, что украденное окно кажется заблокированным. (Могут быть и другие проблемы, но я бы начал с этого).
Попробуйте добавить базовый цикл сообщений туда, где у вас есть вызов getch:
MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0) > 0) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
Могут возникнуть дополнительные трудности. Иметь дочернее окно в другом процессе сложно из-за очереди сообщений для каждого потока. Вопреки мифам, это можно заставить работать: (многопроцессные браузеры делают это).
Возможно, вы захватываете не то окно из Chrome. Помните, что Chrome также играет в эту игру, создавая дочерние окна в отдельных процессах. Вы захватываете одно из дочерних окон или главное окно фрейма?
В конце концов я украл окно в Блокнот. Все, что мне нужно было сделать, это избавиться от окна дочернего редактора Notepad' и проблема с краской исчезла вместе с ним.
Также хорошими стилями, которые нужно применить, являются WS_CHILD
в Chrome и WS_POPUP
в Notepad, за которыми следует сообщение UIS_INITIALIZE
WM_CHANGEUISTATE
в обоих случаях.
Я очень надеюсь, что Chrome Dev' не изменит это поведение.