9

非表示のメッセージのみのウィンドウを作成し、メッセージを待機する単純な 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;
}

ただし、別のアプリケーションからメッセージを受信して​​いません。GetMessage()ブロックするだけで戻りません。FindWindowEx()メッセージを送信するアプリケーションで同じクラス名を使用すると、ウィンドウが見つかります。メッセージだけが明らかに受信されていません。

ここで何か間違ったことをしていますか?ウィンドウ メッセージを受信できる最小のアプリケーションは何ですか?

4

2 に答える 2

6

あなたのメッセージは、ユーザー インターフェース特権の分離によってブロックされる可能性があります。その場合、ChangeWindowMessageFilterEx()関数を使用して WM_COPYDATA メッセージを通過させることができます。

于 2013-05-08T19:27:13.963 に答える