控制台应用程序 接收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;
}




本文转自94cool博客园博客,原文链接:http://www.cnblogs.com/94cool/archive/2009/11/25/1610806.html,如需转载请自行联系原作者  

相关文章
|
6月前
|
存储 运维 Serverless
Serverless 应用引擎产品使用之阿里函数计算中返回函数计算2.0控制台如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6月前
|
存储 测试技术 UED
Qt中实现界面回放的艺术:从理论到代码“ (“The Art of Implementing UI Playback in Qt: From Theory to Code
Qt中实现界面回放的艺术:从理论到代码“ (“The Art of Implementing UI Playback in Qt: From Theory to Code
153 1
|
6月前
|
Android开发 开发者
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
Android UI设计: 请解释Activity的Theme是什么,如何更改应用程序的主题?
154 1
phpstorm插件应用:Test RESTful WEB Service 控制台接口调试工具
phpstorm插件应用:Test RESTful WEB Service 控制台接口调试工具
198 0
|
8天前
|
弹性计算 开发工具 git
2分钟在阿里云ECS控制台部署个人应用(图文示例)
作为一名程序员,我在部署托管于Github/Gitee的代码到阿里云ECS服务器时,经常遇到繁琐的手动配置问题。近期,阿里云ECS控制台推出了一键构建部署功能,简化了这一过程,支持Gitee和GitHub仓库,自动处理git、docker等安装配置,无需手动登录服务器执行命令,大大提升了部署效率。本文将详细介绍该功能的使用方法和适用场景。
2分钟在阿里云ECS控制台部署个人应用(图文示例)
|
2月前
|
开发框架 .NET C#
C# 一分钟浅谈:第一个 C# 控制台应用程序
【9月更文挑战第1天】C# 是一种现代化的、面向对象的编程语言,广泛应用于桌面应用、Web 应用和游戏开发等领域。本文详细介绍如何创建第一个 C# 控制台应用程序,包括使用 Visual Studio 和 .NET SDK 的步骤,并解析常见问题及其解决方法,如控制台窗口立即关闭、编译错误和运行时错误等。通过实践,你将掌握 C# 控制台应用的基础知识,为进一步学习打下坚实基础。
258 48
|
6月前
|
C#
一个库帮你轻松的创建漂亮的.NET控制台应用程序
一个库帮你轻松的创建漂亮的.NET控制台应用程序
118 6
|
3月前
|
Java 应用服务中间件 HSF
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
Java应用结构规范问题之配置Logback以在控制台输出日志的问题如何解决
|
3月前
|
Unix Linux C#
增强用户体验:2个功能强大的.NET控制台应用帮助库
增强用户体验:2个功能强大的.NET控制台应用帮助库
|
3月前
|
开发者 C# 存储
WPF开发者必读:样式与模板的艺术,轻松定制UI外观,让你的应用程序更上一层楼!
【8月更文挑战第31天】在WPF应用开发中,样式与模板是实现美观界面与一致性的关键工具。样式定义了控件如字体、颜色等属性,而模板则允许自定义控件布局与子控件,两者均可存储于`.xaml`文件中。本文介绍了样式与模板的基础知识,通过示例展示了如何创建并应用它们来改变按钮的外观,从而提升用户体验。
80 0