关于DispatchMessage的问题

函数功能:该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。

     函数原型:LONG DispatchMessage(CONST MSG *lpmsg);

     参数:

     lpmsg:指向含有消息的MSG结构的指针。

     返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。

     备注:MSG结构必须包含有效的消息值。如果参数lpmsg指向一个WM_TIMER消息,并且WM_TIMER消息的参数IParam不为NULL,则调用IPa1ram指向的函数,而不是调用窗口程序。

    速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。



 

     DispatchMessage将消息分发到窗口函数中,请问:DispatchMessage是直接返回还是等待WndProc处理完毕再返回? 

      如果直接返回,那一定会造成冲突(几个消息一起处理了),所以我认为肯定是等待WndProc处理完毕后再返回继续取出下条指令来处理。 

      但是在WndProc里调用DialogBox来创建模式对话框的话,WndProc肯定会卡住来等待对话框关闭,如果按照我上面说的理论,DispatchMessage肯定也会卡住,但实际上却并没卡住。 


现在我真是搞不明白了,难道模式对话框是特例? 


 

      用::DiapatchMessage派送消息,在窗口处理过程(WinProc,窗口函数)返回之前,他是阻塞的,不会立即返回,也就是消息循环此时不 能再从消息队列中读取消息,直到::DispatchMessage返回。

所以,当窗口函数处理没有返回的时候,消息循环是不会从消息队列中读取消息的。这也是为什么在模式对话框中要自己用无限循环来继续消息循环,因为这个无限 循环阻塞了原来的消息循环,所以,在这个无限循环中要用GetMessage,PeekMessage,DispatchMessage来从消息队列中读 取消息并派送消息了。

 

      模式对话框是卡住了啊,只不过它内部死循环中又有PeekMessage,GetMessage什么的了,也就是两重消息循环,外层阻塞,内层继续运作,所以不会对界面操作产生影响。

 

      前面已经介绍从系统队列里获取一条消息,然后经过快捷键的函数检查,又通过字符消息函数的转换,最后要做的事情就是调用DispatchMessage函数,它的意思就是说要把这条消息发送到窗口里的消息处理函数WindowProc。

函数DispatchMessage声明如下:
WINUSERAPI
LRESULT
WINAPI
DispatchMessageA(
__in CONST MSG *lpMsg);
WINUSERAPI
LRESULT
WINAPI
DispatchMessageW(
__in CONST MSG *lpMsg);
#ifdef UNICODE
#define DispatchMessage DispatchMessageW
#else
#define DispatchMessage DispatchMessageA
#endif // !UNICODE

lpMsg是指向想向消息处理函数WindowProc发送的消息。

调用这个函数的例子如下:
#001 //主程序入口
#002 //
#003 //
#004 //
#005 //
#006 int APIENTRY _tWinMain(HINSTANCE hInstance,
#007 HINSTANCE hPrevInstance,
#008 LPTSTR lpCmdLine,
#009 int nCmdShow)
#010 {
#011 UNREFERENCED_PARAMETER(hPrevInstance);
#012 UNREFERENCED_PARAMETER(lpCmdLine);
#013 
#014 //
#015 MSG msg;
#016 HACCEL hAccelTable;
#017 
#018 // 加载全局字符串。
#019 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
#020 LoadString(hInstance, IDC_TESTWIN, szWindowClass, MAX_LOADSTRING);
#021 MyRegisterClass(hInstance);
#022 
#023 // 应用程序初始化:
#024 if (!InitInstance (hInstance, nCmdShow))
#025 {
#026 return FALSE;
#027 }
#028 
#029 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_TESTWIN));
#030 
#031 // 消息循环:
#032 BOOL bRet;
#033 while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0)
#034 {
#035 if (bRet == -1)
#036 {
#037 //处理出错。
#038 
#039 }
#040 else if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
#041 {
#042 TranslateMessage(&msg);
#043 DispatchMessage(&msg);
#044 }
#045 }
#046 
#047 return (int) msg.wParam;
#048 }
#049 

第43行就是调用函数DispatchMessage发送消息。

### FinalShell 4.0 的下载与使用说明 #### 工具简介 FinalShell 是一款功能强大的服务器管理工具,支持 SSH 和 RDP 连接,能够帮助用户高效地管理和操作远程服务器。它提供了直观的界面以及丰富的功能模块,适用于 Linux 和 Windows 平台。 --- #### 下载方法 FinalShell 官方网站提供免费版本供用户下载和安装。以下是具体的获取途径: 1. **访问官方网站**: 打开浏览器并输入地址 `https://www.hostbuf.com` 或者直接搜索 “FinalShell” 访问官网。 2. **进入下载页面**: 在首页导航栏找到“下载”选项,点击后可跳转至最新版软件的下载链接区域[^1]。 3. **选择适合的操作系统**: 根据个人电脑所使用的操作系统(Windows、Linux 或 macOS),选择对应的安装包进行下载。 > 注意事项:确保从官方渠道下载正版软件以保障安全性。 --- #### 使用教程 ##### 启动与配置 - 双击已下载完成的安装文件按照提示完成安装流程; - 首次运行时需同意协议条款,并设置默认语言环境为中文或其他偏好语种。 ##### 创建SSH连接 为了建立到目标主机的安全通道,请遵循如下指引: 1. 点击界面上方菜单中的【文件】按钮或者直接选用快捷图标来新增一条记录条目; 2. 填入必要的参数字段比如名称、IP地址/域名、端口号(一般情况下保持标准值22不变),还有认证方式——密码验证或是密钥对验证等细节设定完成后保存提交即可实现一键快速接入需求实例。 --- #### 结合Tomcat服务管理场景应用案例分析 假设当前环境中存在一台部署有Apache Tomcat中间件的服务节点,则可以通过上述介绍的方法利用Finalshell轻松达成对其日常运维工作的辅助作用。例如执行脚本命令分别采用不同形式激活web容器进程从而满足特定业务诉求的同时还能实时监控反馈状态变化趋势以便及时调整优化策略提高整体性能表现水平等等[^2]。 ```bash # 方式一:简单启动 ./startup.sh # 方式二:后台持续运行 nohup ./startup.sh & # 方式三:前台交互调试模式 ./catalina.sh run ``` 同样道理,在必要时刻也可以借助相同手段安全优雅地下线指定资源释放计算能力给其他更重要的任务调配使用: ```bash ./shutdown.sh ``` --- #### 总结 综上所述,FinalShell 不仅是一款便捷高效的终端模拟器产品,而且对于像本文提到关于如何正确操作维护基于Java技术栈构建起来的企业级应用程序套件来说更是不可或缺的好帮手之一。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值