Stealing a window into a CreateWindow window creates a “frozen” window?
我想做的是从屏幕上窃取一个窗口,并使它成为我自己创建的窗口的子级。 当我的程序关闭时,被盗的窗口也会消失,可能还会消失。
所以这是我的问题:
这是我使用的代码(Win32控制台应用程序):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | #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\ \ "); else printf("Chrome not found\ \ "); if(mywin!=0) printf("Got yours\ \ "); else printf("Your window not found\ \ "); SetParent(chrome, mywin); SetWindowLong(chrome, GWL_STYLE, WS_CHILDWINDOW | WS_VISIBLE ); UpdateWindow(chrome); UpdateWindow(mywin); _getch(); } |
哦,顺便说一句,请不要问我我要达到的目标。 :D这是一个惊喜。
您似乎并没有运行消息循环,这对于您自己的窗口是必需的,并且可能对于泵送在子代与父代之间传递的消息是必要的。这似乎是被盗窗口似乎被锁定的最可能原因。 (可能还有其他问题,但我将从这里开始。)
尝试在有getch调用的地方添加一个基本的消息循环:
1 2 3 4 5 | MSG msg = {0}; while (GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } |
可能还有其他困难。由于每个线程的消息队列,在另一个进程中拥有一个子窗口非常棘手。与神话相反,它可以工作:(多进程浏览器可以做到)。
您可能是从Chrome抓取了错误的窗口。请记住,Chrome也玩这个游戏,在单独的过程中创建子窗口。您是要抓住孩子之一还是要抓住主框架窗户?
我最终把窗户偷了进记事本。我要做的就是摆脱记事本的子编辑器窗口,并且绘画问题也随之消失。
同样,需要应用的良好样式是Chrome上的
我真的希望Chrome开发人员不会更改此行为。