Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将窗口偷入CreateWindow窗口会创建一个;冷冻;窗户?_C++_Winapi - Fatal编程技术网

C++ 将窗口偷入CreateWindow窗口会创建一个;冷冻;窗户?

C++ 将窗口偷入CreateWindow窗口会创建一个;冷冻;窗户?,c++,winapi,C++,Winapi,我想做的是从屏幕上偷一个窗口,让它成为我自己创建的窗口的子窗口。当我的程序关闭时,被盗的窗口也会消失,很可能伴随着它的进程 下面是我的问题: 创建的窗口已冻结,它不允许我操作其控件。控制台是否阻止对其进行操作?如果是,我如何解决这个问题 (下面的代码)只在第二次运行时窃取窗口,在第一次运行时不会这样做,窗口仍保留在任务栏中 我也试过这么做,只是我把一个Chrome窗口偷进了一个记事本窗口。同样的问题,当它真的偷走了窗口时,所有的东西看起来都被完全撕碎了,使得浏览器几乎无法运行 以下是我使用的代码

我想做的是从屏幕上偷一个窗口,让它成为我自己创建的窗口的子窗口。当我的程序关闭时,被盗的窗口也会消失,很可能伴随着它的进程

下面是我的问题:

  • 创建的窗口已冻结,它不允许我操作其控件。控制台是否阻止对其进行操作?如果是,我如何解决这个问题
  • (下面的代码)只在第二次运行时窃取窗口,在第一次运行时不会这样做,窗口仍保留在任务栏中
  • 我也试过这么做,只是我把一个Chrome窗口偷进了一个记事本窗口。同样的问题,当它真的偷走了窗口时,所有的东西看起来都被完全撕碎了,使得浏览器几乎无法运行
  • 以下是我使用的代码(Win32控制台应用程序):

    #包括
    #包括
    #包括
    #包括
    LRESULT回调WndProc(HWND、UINT、WPARAM、LPARAM);
    LPCWSTR sClassName=L“MyClass”;
    HWND创建窗口(LPCWSTR WindowTitle){
    //创建并注册该类
    WndClass x 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_应用程序);
    WndClass.hCursor=LoadCursor(空,IDC_箭头);WndClass.hbrBackground=(HBRUSH)(颜色窗口+1);
    WndClass.lpszMenuName=NULL;WndClass.hIconSm=LoadIcon(NULL,IDI_应用程序);
    RegisterClassEx(&WndClass);
    //创建并显示窗口
    HWND HWND=CreateWindowEx(WS_EX_STATICEDGE、sClassName、WindowTitle、WS_OVERLAPPEDWINDOW、,
    CW_usefault,CW_usefault,320,240,NULL,NULL,NULL);
    显示窗口(hwnd,SW_SHOW);更新窗口(hwnd);
    返回hwnd;
    }
    //不知道这是为了什么,回到JS,我们只需要做window.open
    LRESULT回调WndProc(HWND HWND,UINT消息,WPARAM WPARAM,LPARAM LPARAM){
    开关(信息){
    案例WMU关闭:破坏窗口(hwnd);中断;
    案例WM_销毁:PostQuitMessage(0);中断;
    默认值:返回DefWindowProc(hwnd、Message、wParam、lParam);
    }
    返回0;
    }
    //开始
    void main()
    {
    HWND chrome=FindWindow(L“chrome_WidgetWin_1”,空);
    HWND mywin=创建窗口(L“你好老板”);
    if(chrome!=0)printf(“获得chrome\r\n”);else printf(“未找到chrome\r\n”);
    if(mywin!=0)printf(“获得您的\r\n”);else printf(“未找到您的窗口\r\n”);
    SetParent(chrome,mywin);
    SetWindowLong(chrome,GWL_样式,WS|u CHILDWINDOW | WS|u可见);
    更新窗口(chrome);
    更新窗口(mywin);
    _getch();
    }
    

    哦,顺便说一句,请不要问我想要实现什么D这是一个惊喜。

    您似乎没有运行消息循环,这对于您自己的窗口是必需的,对于在孩子和家长之间传递消息可能也是必需的。这似乎是被盗的窗户被锁起来的最可能的原因。(可能还有其他问题,但我从这里开始。)

    尝试在具有getch调用的位置添加基本消息循环:

    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    可能还有其他困难。在另一个进程中使用子窗口是很棘手的,因为每个线程都有消息队列。与神话相反,它可以正常工作:(多进程浏览器可以做到)


    您可能从Chrome上抓取了错误的窗口。记住Chrome也会玩这个游戏,在不同的进程中创建子窗口。您正在抓取一个子窗口还是主框架窗口?

    您似乎没有运行消息循环,这对于您自己的窗口是必需的,并且可能对于在子窗口和父窗口之间传输消息是必需的。这似乎是被盗的窗户被锁起来的最可能的原因。(可能还有其他问题,但我从这里开始。)

    尝试在具有getch调用的位置添加基本消息循环:

    MSG msg = {0};
    while (GetMessage(&msg, NULL, 0, 0) > 0) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    
    可能还有其他困难。在另一个进程中使用子窗口是很棘手的,因为每个线程都有消息队列。与神话相反,它可以正常工作:(多进程浏览器可以做到)


    您可能从Chrome上抓取了错误的窗口。记住Chrome也会玩这个游戏,在不同的进程中创建子窗口。你是在抓一个孩子还是抓主框架的窗户?

    我最终把窗户偷进了记事本。我所要做的就是去掉记事本的子编辑器窗口,油漆问题也随之消失

    此外,需要应用的好样式还有Chrome上的
    WS\u CHILD
    和记事本上的
    WS\u POPUP
    ,然后是这两种浏览器上的
    ui\u INITIALIZE
    WM\u CHANGEUISTATE
    消息

    我真的希望Chrome开发者不会改变这种行为


    我最终把窗户偷进了记事本。我所要做的就是去掉记事本的子编辑器窗口,油漆问题也随之消失

    此外,需要应用的好样式还有Chrome上的
    WS\u CHILD
    和记事本上的
    WS\u POPUP
    ,然后是这两种浏览器上的
    ui\u INITIALIZE
    WM\u CHANGEUISTATE
    消息

    我真的希望Chrome开发者不会改变这种行为


    谢谢您的光临。我正在抓取整个浏览器窗口层次结构,我现在正在试验在
    --kiosk
    模式下启动chrome,因为它没有那么多。我还遇到了一个问题,就是不必在每次调整大小时都用
    WM_PAINT
    发送垃圾邮件。有趣的是,我用自动热键把它装配起来了。尽管全屏模式与窗口不配合…@GRIGORE-TURBODISEL:您不应该发送
    WM\u PAINT
    。相反,请使窗口的受影响部分无效。Windows通常可以将多个失效合并到一个油漆中(如果无效部分无论如何都不可见,甚至可以为零)。谢谢您的光临。我要去拿那个