1

私がやろうとしているのは、画面からウィンドウを盗んで、自分で作成したウィンドウの子にすることです。私のプログラムが閉じると、盗まれたウィンドウも、おそらくそのプロセスとともに消えます。

だからここに私の質問があります:

  1. 作成されたウィンドウはフリーズし、コントロールを操作できなくなります。コンソールはそれが操作されるのを妨げますか?もしそうなら、どうすればこれを修正できますか?
  2. (以下のコード)は、2回目の実行でウィンドウを盗むだけで、最初の実行ではそれを行わず、ウィンドウはタスクバーに残ります。
  3. Chromeウィンドウをメモ帳ウィンドウに盗んだことを除いて、同じことを試しました。同じ問題が発生し、ウィンドウが盗まれたとき、すべてが完全にバラバラに見え、ブラウザが実質的に動作しなくなりました。

これが私が使用したコードです(Win32コンソールアプリケーション):

#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();
}

ところで、私が何を達成しようとしているのか私に聞かないでください。:Dそれは驚きです。

4

2 に答える 2

3

自分のウィンドウに必要なメッセージループを実行していないようです。これは、子と親の間を行き来するメッセージをポンピングするためにおそらく必要です。これが、盗まれたウィンドウがロックされているように見える最も可能性の高い理由のようです。(他にも問題があるかもしれませんが、ここから始めます。)

getch呼び出しがある場所に基本的なメッセージループを追加してみてください。

MSG msg = {0};
while (GetMessage(&msg, NULL, 0, 0) > 0) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

追加の問題があるかもしれません。スレッドごとのメッセージキューがあるため、別のプロセスに子ウィンドウを設定するのは難しいです。神話に反して、それを機能させることができます:(マルチプロセスブラウザがそれを行います)。

Chromeから間違ったウィンドウを取得している可能性があります。Chromeもこのゲームをプレイし、別々のプロセスで子ウィンドウを作成することを忘れないでください。子の1つをつかんでいますか、それともメインフレームウィンドウをつかんでいますか?

于 2012-06-11T23:48:38.430 に答える
1

私は最終的にウィンドウをメモ帳に盗みました。私がしなければならなかったのは、メモ帳の子エディタウィンドウを取り除くことだけで、ペイントの問題はそれに伴ってなくなります。

また、適用する必要のある優れたスタイルはWS_CHILD、ChromeとWS_POPUPメモ帳にあり、その後UIS_INITIALIZE WM_CHANGEUISTATEに両方にメッセージが表示されます。

ChromeDevがこの動作を変更しないことを本当に望んでいます。

ここに画像の説明を入力してください

于 2012-06-12T07:29:05.063 に答える