当前位置:  开发笔记 > 开发工具 > 正文

TService不会处理消息

如何解决《TService不会处理消息》经验,为你挑选了2个好方法。

我创建了一个使用Windows Messaging System的Windows服务.当我从调试器测试应用程序时,消息很好地通过,但是当我安装它时,我的消息...在14分钟前询问

弗拉基米尔1tuga



1> Rob Kennedy..:

服务通常不接收窗口消息.它们根本不一定有窗口把手.即使他们这样做,他们也会在一个单独的桌面上运行.程序无法将消息从一个桌面发送到另一个桌面,因此服务只能接收来自其他服务或服务启动的程序的消息.

在Windows Vista之前,您可以将服务配置为与桌面交互.这使得服务在与登录用户相同的桌面上运行,因此以该用户身份运行的程序可以向服务的窗口发送消息.但是Windows Vista隔离了服务; 他们不能再与任何用户的桌面交互.

还有许多其他方式与服务进行通信.它们包括命名管道,邮件槽,内存映射文件,信号量,事件和套接字.

例如,使用套接字,您的服务可以在开放端口上侦听,需要与之通信的程序可以连接到该端口.这可以打开远程管理的大门,但您也可以将服务限制为仅侦听本地连接.

以上所有都试图告诉你,你采取了错误的方法.但也有问题在于手头.您的程序在调试器中表现出一种方式,而在其他方面则表现不同.如果没有安装,你如何调试服务?您的服务运行的用户帐户是什么?你的调试器?您尝试了哪些不涉及调试器的调试技术(例如writeln,用于跟踪程序操作的日志文件)?



2> Mick..:

当你说它"使用"Windows Messaging System时,你是什么意思?您正在使用或发送Windows消息吗?

如果发送Windows消息,则需要确保正确执行此操作.我建议编写一个消息循环,以确保您的消息正确分派.我还建议阅读消息循环及其工作原理.

什么是消息循环(单击要获取此信息来源的标题)

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}

    消息循环调用GetMessage(),它在您的消息队列中查找.如果消息队列为空,则程序基本上停止并等待一个(它阻塞).

    当发生事件导致消息被添加到队列时(例如系统注册鼠标单击)GetMessages()返回一个正值,表示有一条消息要处理,并且它已填写MSG的成员结构我们通过它.如果它击中WM_QUIT则返回0,如果发生错误则返回负值.

    我们接收消息(在Msg变量中)并将其传递给TranslateMessage(),这会进行一些额外的处理,将虚拟键消息转换为字符消息.这一步实际上是可选的,但如果不存在,某些事情将无效.

    完成后,我们将消息传递给DispatchMessage().DispatchMessage()所做的是获取消息,检查它所在的窗口,然后查找窗口的Window Procedure.然后它调用该过程,作为参数发送窗口的句柄,消息以及wParam和lParam.

    在你的窗口过程中,你检查消息及其参数,并用它们做任何你想做的事!如果您没有处理特定的消息,您几乎总是调用DefWindowProc(),它将为您执行默认操作(这通常意味着它什么都不做).

    处理完消息后,Windows程序返回,DispatchMessage()返回,然后返回循环的开头.

推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有