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 通常位于第二列,紧挨着可执行文件名称。使用 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;
}

您可能只会在控制台中看到一行。此行中的文本是类名,该文本应FindWindowEx作为第三个参数给出,而不是现有的“SoftKeyboard.exe*32”。

对于“未使用的 CXX0030”问题,只需用谷歌搜索:未使用的 CXX0030。你会看到这是正常的。

于 2013-11-06T13:04:15.590 回答
0

窗口类名称不是出现在窗口顶部的名称。确定窗口类名的唯一方法是使用 Visual Studio 附带的 Spy++ 工具。

于 2013-11-06T12:57:05.023 回答