如何使用控制台应用程序中的仅消息窗口接收消息?

fut*_*lib 7 c++ windows winapi ipc console-application

我创建了一个简单的Win32控制台应用程序,它创建一个隐藏的仅消息窗口并等待消息,完整代码如下所示.

#include <iostream>
#include <Windows.h>

namespace {
  LRESULT CALLBACK WindowProcedure(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  {
    if (uMsg == WM_COPYDATA)
      std::cout << "Got a message!" << std::endl;
    return DefWindowProc(hWnd, uMsg, wParam, lParam);
  }
}

int main()
{
  WNDCLASS windowClass = {};
  windowClass.lpfnWndProc = WindowProcedure;
  LPCWSTR windowClassName = L"FoobarMessageOnlyWindow";
  windowClass.lpszClassName = windowClassName;
  if (!RegisterClass(&windowClass)) {
    std::cout << "Failed to register window class" << std::endl;
    return 1;
  }
  HWND messageWindow = CreateWindow(windowClassName, 0, 0, 0, 0, 0, 0, HWND_MESSAGE, 0, 0, 0);
  if (!messageWindow) {
    std::cout << "Failed to create message-only window" << std::endl;
    return 1;
  }

  MSG msg;
  while (GetMessage(&msg, 0, 0, 0) > 0) {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}
Run Code Online (Sandbox Code Playgroud)

但是,我没有收到来自其他应用程序的任何消息.GetMessage()只是块,永远不会回来.我FindWindowEx()在发送消息的应用程序中使用相同的类名,然后找到窗口.只是信息显然从未收到过.

我在这里做错了吗?什么是可以接收窗口消息的最小应用程序?

Her*_*bob 6

用户界面权限隔离可能会阻止您的邮件.在这种情况下,您可以使用该ChangeWindowMessageFilterEx()函数来允许WM_COPYDATA消息通过.

  • @vlad_tepesch这只是一个测试,看看UAC是否是问题.如果我愿意,我无法让所有用户禁用UAC. (3认同)