控制台应用程序 接收UI消息 CODE: C

控制台应用程序 接收UI消息

//==========xisat @ 2009-2-10=========

 一个古老的问题,箱底翻出来

标准的控制台应用程序是无法接收到系统的UI消息的,原因很简单,没有UI,windows消息没法投递过来。

需要解决这个问题也很简单

大致如下:

1. RegisterClassEx 注册窗口类

2. CreateWindow 创建隐藏窗口

3. 在WndProc 中处理消息

也可以这样:

1.CreateWindow创建一个已知类的窗口控件

2.SetWindowLong子类化该控件

3.在子类化的消息函数中处理消息

 主要过程如下

view plaincopy to clipboardprint?
//一个消息循环是必需的  
int messLoop()  
{  
        MSG msg;  
        hWnd=cwindow();  
        g_oldLBProc=(WNDPROC)SetWindowLongA(hWnd,   GWL_WNDPROC,  (LONG) MyLBProc);//子类化窗口控件   
            // 消息循环:  
        while (GetMessage(&msg, NULL, 0, 0))  
        {  
                TranslateMessage(&msg);  
                DispatchMessage(&msg);  
        }  
        return 0;  

//一个消息循环是必需的
int messLoop()
{
  MSG msg;
  hWnd=cwindow();
  g_oldLBProc=(WNDPROC)SetWindowLongA(hWnd,   GWL_WNDPROC,  (LONG) MyLBProc);//子类化窗口控件
   // 消息循环:
  while (GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return 0;
}

cwindow()创建一个隐藏的button

view plaincopy to clipboardprint?
//建立隐藏窗口接受UI消息  
HWND cwindow()  
{  
      
    HWND hWnd;  
        hWnd = CreateWindow(L"Button",L"xcmd" ,WS_POPUP,  
            0, 0,  
            20, 30,  
            NULL,  
            0, NULL,GetModuleHandle(NULL),  
            NULL);  
 
        return hWnd;  
        //UpdateWindow(hWnd);  
        //ShowWindow(hWnd, 1);  
          

//建立隐藏窗口接受UI消息
HWND cwindow()
{
 
 HWND hWnd;
  hWnd = CreateWindow(L"Button",L"xcmd" ,WS_POPUP,
   0, 0,
   20, 30,
   NULL,
   0, NULL,GetModuleHandle(NULL),
   NULL);

  return hWnd;
  //UpdateWindow(hWnd);
  //ShowWindow(hWnd, 1);
  
}

在子类化的消息处理函数中处理消息

view plaincopy to clipboardprint?
//子类化的窗口控件消息处理函数  
LRESULT   CALLBACK   MyLBProc(HWND   hWnd,   UINT   uMsg,   WPARAM   wParam,   LPARAM   lParam)     
  {     
          
        switch(uMsg)     
      {     
 
            case WM_DEVICECHANGE:  
                 printf(" 0x%X -- 0x%X ",uMsg,wParam);  
                 //if(wParam==DBT_DEVICEARRIVAL)  
                 //{  
                    // DestroyWindow(hWnd);//销毁窗口,防止主线程中的waitforsingleobject阻塞消息  
                    // ExitProcess(1);  
                    //}  
           break;     
      }     
      return   CallWindowProc(g_oldLBProc,   hWnd,    uMsg,   wParam,   lParam);     
  }    
//子类化的窗口控件消息处理函数
LRESULT   CALLBACK   MyLBProc(HWND   hWnd,   UINT   uMsg,   WPARAM   wParam,   LPARAM   lParam)  
  {  
  
        switch(uMsg)  
      {  

         case WM_DEVICECHANGE:
     printf(" 0x%X -- 0x%X ",uMsg,wParam);
     //if(wParam==DBT_DEVICEARRIVAL)
     //{
     // DestroyWindow(hWnd);//销毁窗口,防止主线程中的waitforsingleobject阻塞消息
     // ExitProcess(1);
     //}
           break;  
      }  
      return   CallWindowProc(g_oldLBProc,   hWnd,    uMsg,   wParam,   lParam);  
  }   

这里演示接受USB设备 WM_DEVICECHANGE 消息 如果还需要处理 DBT_DEVICEARRIVAL 消息

可以使用RegisterDeviceNotification 注册设备通知

cwindow()修改下

view plaincopy to clipboardprint?
HWND cwindow()  
{  
      
    HWND hWnd;  
        hWnd = CreateWindow(L"Button",L"xcmd" ,WS_POPUP,  
            0, 0,  
            20, 30,  
            NULL,  
            0, NULL,GetModuleHandle(NULL),  
            NULL);  
        //GUID interfaceGUID={0x4D36E967,0xE325,0x11CE,0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18};//iscsi volume  
        GUID interfaceGUID={ 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };//usb volume  
        HDEVNOTIFY hDeviceNotify ;  
        if(RegDeviceInterface(interfaceGUID,hWnd,&hDeviceNotify))  
            return hWnd;  
        //UpdateWindow(hWnd);  
        //ShowWindow(hWnd, 1);  
          

HWND cwindow()
{
 
 HWND hWnd;
  hWnd = CreateWindow(L"Button",L"xcmd" ,WS_POPUP,
   0, 0,
   20, 30,
   NULL,
   0, NULL,GetModuleHandle(NULL),
   NULL);
  //GUID interfaceGUID={0x4D36E967,0xE325,0x11CE,0xBF,0xC1,0x08,0x00,0x2B,0xE1,0x03,0x18};//iscsi volume
  GUID interfaceGUID={ 0xA5DCBF10, 0x6530, 0x11D2, { 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED } };//usb volume
  HDEVNOTIFY hDeviceNotify ;
  if(RegDeviceInterface(interfaceGUID,hWnd,&hDeviceNotify))
   return hWnd;
  //UpdateWindow(hWnd);
  //ShowWindow(hWnd, 1);
  
}

view plaincopy to clipboardprint?
//注册设备通知b y MSDN example  
BOOL RegDeviceInterface(   
    IN GUID InterfaceClassGuid,   
    IN HWND hWnd,  
    OUT HDEVNOTIFY *hDeviceNotify   
)  
{  
    DEV_BROADCAST_DEVICEINTERFACE NotificationFilter;  
 
    ZeroMemory( &NotificationFilter, sizeof(NotificationFilter) );  
    NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);  
    NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;  
    NotificationFilter.dbcc_classguid = InterfaceClassGuid;  
 
    *hDeviceNotify = RegisterDeviceNotification(   
        hWnd,                       // events recipient  
        &NotificationFilter,        // type of device  
        DEVICE_NOTIFY_WINDOW_HANDLE // type of recipient handle  
        );  
 
    if ( NULL == *hDeviceNotify )   
    {  
        return FALSE;  
    }  
 
    return TRUE;  

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/xisat/archive/2009/02/10/3874650.aspx

posted @   94cool  阅读(701)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
< 2009年11月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12
点击右上角即可分享
微信分享提示