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

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

#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() ,并find该窗口。 只是这个消息显然是从来没有收到。

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

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

我不知道你的程序是错的,但我总是使用相反的方法:我创建一个win32应用程序,剥离并添加控制台窗口。

剥离的所有包含winapp版本(也删除所有afx垃圾文件):

 // Modify the following defines if you have to target a platform prior to the ones specified below. // Refer to MSDN for the latest info on corresponding values for different platforms. #ifndef WINVER // Allow use of features specific to Windows XP or later. #define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later. #define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows. #endif #ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later. #define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later. #endif #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers // MinWInApp.cpp : Defines the entry point for the application. // #include <windows.h> // C RunTime Header Files #include <stdlib.h> #include <malloc.h> #include <memory.h> #include <tchar.h> #include <strsafe.h> #define MAX_LOADSTRING 100 #define SZ_TITLE "MinWinApp" #define SZ_WND_CLASS "MINWINAPP" // Global Variables: HINSTANCE g_hInst; // current instance HWND g_hWnd; HWND g_hwndNextViewer; TCHAR* szWndClass = TEXT(SZ_WND_CLASS); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: Place code here. MSG msg; WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = NULL; wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1); wcex.lpszMenuName = NULL; wcex.lpszClassName = szWndClass; wcex.hIconSm = NULL; RegisterClassEx(&wcex); g_hInst = hInstance; // Store instance handle in our global variable g_hWnd = CreateWindow(szWndClass, TEXT(SZ_TITLE), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!g_hWnd) { return FALSE; } ShowWindow(g_hWnd, SW_SHOW); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int) msg.wParam; } LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; switch (message) { case WM_CREATE: break; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); // Parse the menu selections: switch (wmId) { case 0: default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } 

这里可以找到添加控制台窗口的代码: http : //justcheckingonall.wordpress.com/2008/08/29/console-window-win32-app/