关于c ++:将窗口隐藏到CreateWindow窗口中会创建一个“冻结”窗口吗?

Stealing a window into a CreateWindow window creates a “frozen” window?

我想做的是从屏幕上窃取一个窗口,并使它成为我自己创建的窗口的子级。 当我的程序关闭时,被盗的窗口也会消失,可能还会消失。

所以这是我的问题:

  • 创建的窗口被冻结,不允许我操作其控件。 控制台是否会阻止其操作? 如果是这样,我该如何解决?
  • (下面的代码)仅在第二次运行时窃取该窗口,而在第一次运行时不窃取该窗口,并且该窗口仍保留在任务栏中。
  • 除了将Chrome窗口偷到记事本窗口之外,我尝试过相同的操作。 同样的问题,当它确实偷走了窗户时,一切看上去都被撕裂了,使浏览器几乎无法操作。
  • 这是我使用的代码(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上的WS_CHILD和记事本上的WS_POPUP,然后在两者上均显示UIS_INITIALIZE WM_CHANGEUISTATE消息。

    我真的希望Chrome开发人员不会更改此行为。

    enter image description here