为什么FindWindowEx()产生null结果?

时间:2013-11-06 09:42:52

标签: visual-studio-2010 visual-c++ msdn

我正在尝试找到一个名为“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?是否有其他方法可以找到此窗口?

2 个答案:

答案 0 :(得分: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”问题只需google it:未使用的CXX0030。你会发现这很正常。

答案 1 :(得分:0)

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