0

「VirtualKeyboard」という開いているウィンドウを見つけようとしています。これは現在、次のコードを使用して実現されています:-

LPCWSTR WindowName =L"SoftKeyboard.exe*32";

HWND Find = ::FindWindowEx(0, 0,WindowName, 0);
cout<<Find<<endl;

WindowName はタスク マネージャーから取得され、SoftKeyboard.exe*32 というプロセス名になるように初期化しました。また、Virtual_Keyboard というタスク名を使用してテストしましたが、どちらも NULL の結果を生成しました。このプログラムを実行する前にウィンドウが開かれました。

「HWND Find = ::FindWindowEx(0, 0,WindowName, 0);」を含む行にブレークポイントを配置しました。Autos ウィンドウに次のように表示されました。

 -      Find    0xcccccccccccccccc {unused=??? }    HWND__ *
        unused  CXX0030: Error: expression cannot be evaluated  

これはどのように修正できますか?なぜこれが発生するのですか?WindowName はタスク マネージャーから抽出されますか?このウィンドウを見つける別の方法はありますか?

4

2 に答える 2

1

検索するウィンドウのウィンドウ クラス名を見つける必要があります。現在、ウィンドウが作成されるプロセスが SoftKeyboard.exe であることだけがわかっています。まず、このプロセスのプロセス ID を特定する必要があります。タスク マネージャーでは、プロセス ID は通常、実行可能ファイル名のすぐ隣の 2 列目にあります。Spy++ または次の一時的なコードを使用して、このプロセスに属するすべてのウィンドウ クラス名を検出します。

BOOL CALLBACK WriteWindowClass(HWND hWnd, LPARAM lParam)
{
    DWORD nThreadID, nProcessID;
    nThreadID = GetWindowThreadProcessId(hWnd, &nProcessID);

    if (nProcessID == XXX) // Write SoftKeyboard's Process ID instead of XXX
    {
        WCHAR szClassName[256];
        GetClassName(hWnd, szClassName, 256);

        std::wcout << szClassName << std::endl;
    }

    return TRUE;
}

int wmain(int argc, wchar_t* argv[]) 
{
    EnumWindows(WriteWindowClass, 0);

    return 0;
}

おそらく、コンソールには 1 行しか表示されません。この行のテキストはクラス名でありFindWindowEx、既存の「SoftKeyboard.exe*32」の代わりに、このテキストを 3 番目のパラメーターとして指定する必要があります。

「未使用の CXX0030」の問題については、Google で「未使用の CXX0030」と検索してください。これが正常であることがわかります。

于 2013-11-06T13:04:15.590 に答える
0

The window class name is not the name appearing at the top of the window. The only way to determine the window class name is to use the Spy++ tool that comes with Visual Studio.

于 2013-11-06T12:57:05.023 に答える