6

この質問に対する答えが見つからなかったので、MSDN をさらに調べたところ、isChild() が見つかりました。それは私にその他の質問への答えを与えるかもしれません.

ここで、isChild() を使用するために、確認したい親アプリケーション (この場合は自分のアプリケーション) の HWND を渡す必要があります。自分のアプリケーションの HWND を取得するにはどうすればよいですか?

タイトルがコロコロ変わるのでわからないのでFindWindow()が使えません。

ありがとう

編集:

明確ではないので、さらに情報を追加します。ウィンドウを作成していません。ウィンドウの作成にアクセスできません。私のコードは、他のプログラマーがコーディングしているアプリケーションと一緒にコンパイルされるコードの一部であり、ウィンドウの作成方法、タイトル、またはその他の情報にはアクセスできません。では、実行中のアプリケーションの「WINDOW」に HWND を取得するにはどうすればよいでしょうか。

4

8 に答える 8

9

アプリケーションに HWND がありません。窓はそうです。アプリケーションにはウィンドウがない場合もあれば、ウィンドウが多数ある場合もあるため、「アプリケーションの HWND を取得する」ための一般的な機能はありません。

明らかな解決策は、ハンドルを握ったときにハンドルをつかむことです。ウィンドウを作成すると、HWND が返されます。それを保存します。

于 2009-07-14T14:03:36.667 に答える
6

GetTopWindow() と GetNextWindow() を使用して、ウィンドウの z オーダーをウォークスルーします。

ただし、必要ではないと思いますが、GetCurrentProcessId() と GetWindowThreadProcessId() を使用できます。次のようなものが役立つ場合があります。

HWND FindMyTopMostWindow()
{
    DWORD dwProcID = GetCurrentProcessId();
    HWND hWnd = GetTopWindow(GetDesktopWindow());
    while(hWnd)
    {
        DWORD dwWndProcID = 0;
        GetWindowThreadProcessId(hWnd, &dwWndProcID);
        if(dwWndProcID == dwProcID)
            return hWnd;            
        hWnd = GetNextWindow(hWnd, GW_HWNDNEXT);
    }
    return NULL;
 }
于 2009-07-14T14:06:04.290 に答える
1

CreateWindow から返されたハンドルを保持することはできませんか? そうでない場合、なぜですか?

于 2009-07-14T13:57:50.947 に答える
1

他の人がすでに指摘しているように

  • 一般に、アプリケーションはゼロまたは複数のトップレベル ウィンドウを持つことができます。
  • 自分でウィンドウを作成している場合は、HWND をどこかに覚えておくことができます。

ただし、コードが DLL に含まれている可能性があるため、実際にはトップレベル ウィンドウを自分で作成していません。じゃあ何をすればいいの?

次のことをお勧めします。

  • EnumWindowsすべての最上位ウィンドウを列挙するために使用します。
  • GetWindowLongPtr各トップレベル ウィンドウの HINSTANCE を取得するために使用します。これを、 を使用して取得できるアプリケーションの HINSTANCE と比較しますGetModuleHandle(NULL)。それらが同一である場合、メイン ウィンドウが見つかりました。

編集:ここにいくつかのコードがあります。IsWindowVisible目に見えない「ヘルパー」ウィンドウがかなりあるように見えるため、使用する必要があることがわかりました。

HWND hwndMain;

BOOL CALLBACK EnumWindowProc(HWND hwnd, LPARAM lParam)
{
    HINSTANCE hinst=(HINSTANCE)GetModuleHandle(NULL);

    if((HINSTANCE)GetWindowLongPtr(hwnd, GWL_HINSTANCE)==hinst &&
        IsWindowVisible(hwnd))
    {
        hwndMain=hwnd;
        return FALSE;
    }
    else
        return TRUE;
}

次に、ウィンドウを見つけたい場所で:

hwndMain=NULL;
EnumWindows(EnumWindowProc, 0);

この後hwndMain、ウィンドウのハンドルが含まれている必要がありますNULL。存在しない場合。

MSDN が次のように述べているように、使用EnumWindowsは少し面倒ですがGetWindow、ループで呼び出すよりも推奨されます。「このタスクを実行するために GetWindow を呼び出すアプリケーションは、無限ループに陥るか、破棄されたウィンドウへのハンドルを参照するリスクがあります。

于 2009-07-14T14:20:22.163 に答える
0

これは私にとって古いものですが、IIRC ではウィンドウ プロシージャのパラメーターとして HWND を受け取る必要があります。最初のどこかにグローバル変数に保存できます。

于 2009-07-14T13:59:17.933 に答える
0

あなたのWindowsクラス名はどうですか?ウィンドウの作成では常に異なりますか? そうでない場合でも、FindWindow() を使用できます。

于 2009-07-14T14:04:46.367 に答える