一个窗口类,以下是两个关键函数。
这个窗口在一般的基于对话框的应用程序中能收到外部发到m_hWnd上的自定义消息,以及OnTimer事件。
但是在控制台程序或者服务程序下,就无法收到自定义消息了。
请问还需要做些什么?重分相谢谢,分不够再加。另注:这个窗口类是在一个COM组件中使用,但调用COM组件的有可能是控制台、服务程序,也有可能是一个窗口应用程序。但是目前在控制台和服务程序下使用COM时,COM中的窗口类无法处理到自定义消息。//构造函数
CHelperWindow()
{
WNDCLASSEX wndclass;
wndclass.cbSize = sizeof wndclass;
wndclass.style = 0;
wndclass.lpfnWndProc = WindowProc;
wndclass.cbClsExtra = 0;
wndclass.cbWndExtra = 0;
wndclass.hInstance = GetModuleHandle(0);
wndclass.hIcon = 0;
wndclass.hCursor = 0;
wndclass.hbrBackground = 0;
wndclass.lpszMenuName = 0;
wndclass.lpszClassName = _T("Helper Window");
wndclass.hIconSm = 0;
RegisterClassEx(&wndclass);

m_hWnd=CreateWindow(_T("Helper Window"), _T("Helper Window"), 0, 0, 0, 0, 0, 0, 0, 0, GetModuleHandle(0));

ASSERT(m_hWnd);
SetWindowLong(m_hWnd, GWL_USERDATA, (LONG)this);
}static LRESULT CALLBACK WindowProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
{
if (message == WM_USER + 100)
{
//消息处理......略......
//控制台下为何收不到消息?
}

return 0;
}

解决方案 »

  1.   

    CreateWindow()后没进入while()消息循环?
      

  2.   

    //以上是WinMain()函数的第一项工作:产生主窗口。
      //下面是WinMain()函数的第二项工作:建立主消息循环。
      //下面这个循环就是Windows程序的心脏:主消息循环。一旦退出主消息循环,程序就结束了。
      
      // 主消息循环:
      while (GetMessage(&msg, NULL, 0, 0)) //使用GetMessage函数从消息队列中获取消息;
      {
      if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) //解释加速键
      {
      TranslateMessage(&msg); //使用TranslateMessage函数解释消息;
      DispatchMessage(&msg); //发送消息到主窗口函数中去。
      }
      }
      //退出消息循环,WinMain函数才返回,程序才结束。
      return (int) msg.wParam;
      }
      

  3.   

    LZ,你的自定义消息是多少?你在GetMessage的时候,第四个参数wMsgFilterMax必须大于或等于你的自定义消息,不然的话,在控制台下接收不了(在服务下没试过,不过应该也是一样的),这个参数是设置获取的消息的最大值,用来过滤掉一些不需要的消息。不过在GUI程序下就不用设置这个参数,不知道windows是怎样搞的,我靠(习惯了说这句,呵)#include <windows.h>
    #include <iostream>
    using namespace std;int main()
    {
    DWORD dwThread;
    MSG msg;
    DWORD dwMyMsg = WM_USER + 128; dwThread = GetCurrentThreadId();
    PostThreadMessage(dwThread, dwMyMsg, (WPARAM)0, (LPARAM)0); while (GetMessage(&msg, NULL, 0, WM_USER+129)) 
    {
    if (msg.message == dwMyMsg)
    cout << "has receive dwMyMsg\n";
    else
    cout << "Message: " << msg.message << endl;
    } return 0;
    }这段程序输出has receive dwMyMsg