c++ - FindWindow( ... ) 不是 'finding' 创建的消息窗口

标签 c++ windows c++11 findwindow findwindowex

在我的代码中,我有一个消息类,我想从另一个进程中“查找”它。

class MyWindow : public CWnd
{
public:
  MyWindow::MyWindow(LPCTSTR pszClassName)
  {
    auto wcn = ::AfxRegisterWndClass(NULL);
    auto created = this->CreateEx(0, wcn, pszClassName, 0, 0, 0, 0, 0, HWND_MESSAGE, 0);
  }
};

然后在我的主应用程序中的某个地方。

...
auto pszClassName = _T("MyWindowClass");
auto wnd = new MyWindow(pszClassName);

auto p = FindWindow(pszClassName, nullptr); // = nullptr

// or using FindWindowExW( ... )
p = FindWindowExW(nullptr, nullptr, pszClassName, nullptr);// = nullptr
p = FindWindowExW(HWND_MESSAGE, nullptr, pszClassName, nullptr);// = nullptr

因此,无论我做什么,我似乎从未“找到”创建的窗口。

如何创建一个可以使用 FindWindow[Ex]“找到”的窗口

最佳答案

我正在使用 VS2013 控制台应用程序。我稍微修改了您的代码以创建一个普通窗口和一个仅消息窗口,并通过类名查找它们的句柄。

输出:

Normal window=00000000003A06FE Message-only window=00000000001F06CA
FindWindow=00000000003A06FE
FindWindowEx=00000000003A06FE
FindWindowEx(HWND_MESSAGE,...)=00000000001F06CA

代码:

typedef std::basic_string<TCHAR> tstring;

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

class MyWindow //: public CWnd
{
public:
    tstring className;
    HWND hwnd;
    HWND hwndMsgOnly;
    HWND find1;
    HWND find2;
    HWND find3;

    MyWindow::MyWindow(LPCTSTR pszClassName)
    {
        className = pszClassName;

        //auto wcn = ::AfxRegisterWndClass(NULL);
        //auto created = this->CreateEx(0, wcn, pszClassName, 0, 0, 0, 0, 0, HWND_MESSAGE, 0);

        // For a console app, `hInstance` is the instance of the program
        HINSTANCE hInstance = GetModuleHandle(0);

        WNDCLASSEX windowClass;
        windowClass.lpszClassName = pszClassName;
        windowClass.cbClsExtra = NULL;
        windowClass.cbWndExtra = NULL;
        windowClass.cbSize = sizeof(WNDCLASSEX);
        windowClass.hbrBackground = (HBRUSH)CreateSolidBrush(RGB(150, 0, 0));
        windowClass.hCursor = LoadCursor(NULL, IDC_ARROW);
        windowClass.hIcon = LoadIcon(NULL, MAKEINTRESOURCE(IDI_APPLICATION));
        windowClass.hIconSm = (HICON)LoadImage(NULL, MAKEINTRESOURCE(IDI_APPLICATION), IMAGE_ICON, 16, 16, NULL);
        windowClass.hInstance = hInstance;
        windowClass.lpfnWndProc = WindowProc;
        windowClass.lpszMenuName = NULL;
        windowClass.style = CS_VREDRAW | CS_HREDRAW;
        RegisterClassEx(&windowClass);
        hwnd = CreateWindowEx(NULL, pszClassName, _T("Basic Window"), WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 500, 500, NULL, NULL, hInstance, NULL);
        hwndMsgOnly = CreateWindowEx(NULL, pszClassName, _T("Dummy name"), 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
    }
};

void window_test(MyWindow & wnd)
{
    LPCTSTR pszClassName = wnd.className.c_str();
    wnd.find1 = FindWindow(pszClassName, nullptr); // = nullptr for OP version; okay for this version

    // or using FindWindowExW( ... )
    /**
        HWND hwndParent is a handle to the parent window whose child windows are to be searched.
        If hwndParent is NULL, the function uses the desktop window as the parent window.The function searches among windows that are child windows of the desktop.
        If hwndParent is HWND_MESSAGE, the function searches all message-only windows.
    **/
    HWND hWndParent = nullptr;
    wnd.find2 = FindWindowExW(hWndParent, nullptr, pszClassName, nullptr);// = nullptr for OP version; okay for this version
    hWndParent = HWND_MESSAGE;
    wnd.find3 = FindWindowExW(hWndParent, nullptr, pszClassName, nullptr);// = nullptr for OP version; finds the message-only window in this version
}

void main()
{
    MyWindow wnd(_T("test_window"));
    cout << "Normal window=" << wnd.hwnd << " Message-only window=" << wnd.hwndMsgOnly << endl;
    window_test(wnd);
    cout << "FindWindow=" << wnd.find1 << endl;
    cout << "FindWindowEx=" << wnd.find2 << endl;
    cout << "FindWindowEx(HWND_MESSAGE,...)=" << wnd.find3 << endl;
}

关于c++ - FindWindow( ... ) 不是 'finding' 创建的消息窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38009059/

相关文章:

c++ - 构造函数初始值设定项列表中长度未知的数组

c++ - 如何在 Windows 上将 GoogleTest 变量 GTEST_LIBRARY GTEST_INCLUDE_DIR 和 GTEST_MAIN_LIBRARY 设置为 CMake?

c++ - UML 设计模式和 C++ 类的实现

c++ - 链表类的复制构造函数

java - 如何在 Windows 中通过端口查找 PID 并使用 Java 终止找到的任务

c++ - 表示 native 有符号和无符号整数大小的数据类型?

c++ - 在 std 算法中使用 std::move_iterator 并以 lambda 作为 pred 是否安全

c++ - 模板 typedef c++0x

c++ - 如何使用 Base 8(八进制)数字?

windows - 如何通过 API 查询 Windows Phone 7 电话号码?