【问题标题】:Handle message from another thread in Win32 windows在 Win32 窗口中处理来自另一个线程的消息
【发布时间】:2022-01-21 12:12:54
【问题描述】:

我用 Win32s 创建了一个窗口,我希望它除了可以处理典型的 windows 消息外,还可以处理来自另一个线程的传入消息。

我正在使用这段代码:

 while (dataAvailable || GetMessage(&msg, nullptr, 0, 0)) 
    {
       // if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        if (dataAvailable == true)
        {
            cout << "My thread message/signal!" << endl;
            dataAvailable = false;
        }
        else
        {
            //Windows message
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }

“DataAvailable”是一个原子布尔值,当我想将自己的消息传递给 win32 应用程序/windows 时设置。

这不好用。

可以这样做吗?

【问题讨论】:

标签: c++ windows multithreading event-handling win32gui


【解决方案1】:

我建议您使用标准消息。注册您自己的新消息并使用 PostMessage 从另一个线程到您的主窗口线程。

我的示例代码基于标准 Windows 示例代码:https://github.com/microsoft/Windows-classic-samples/blob/main/Samples/Win7Samples/begin/LearnWin32/HelloWorld/cpp/main.cpp

在这段代码中,我添加了一个标准的 std::thread :

// ... 

  auto th1 = std::thread([=] {
    const UINT WM_EX_SOME_SPECIALINTERNALMESSAGE = ::RegisterWindowMessage(L"SomeSpecialInternalMessage");
    for (int n = 0; n < 10; ++n) {
      PostMessage(hwnd, WM_EX_SOME_SPECIALINTERNALMESSAGE, 0, 0);
      Sleep(1000);
    }
  });

  // Run the message loop.
  MSG msg = { };
  while (GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }

  th1.join();

正如您在这段代码中看到的,WM_EX_SOME_SPECIALINTERNALMESSAGE 是一个自定义窗口消息。它每秒都会发布到您的主窗口 proc:WindowProc。要接收它,请修改 WindowProc:

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
  const UINT WM_EX_SOME_SPECIALINTERNALMESSAGE = ::RegisterWindowMessage(L"SomeSpecialInternalMessage");

  if(uMsg == WM_EX_SOME_SPECIALINTERNALMESSAGE) {
    OutputDebugStringW(L"WM_EX_SOME_SPECIALINTERNALMESSAGE\n");
  }
  
  // ...

【讨论】:

    猜你喜欢
    • 2010-11-24
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-06
    相关资源
    最近更新 更多