我创建了一个使用Windows Messaging System的Windows服务.当我从调试器测试应用程序时,消息很好地通过,但是当我安装它时,我的消息...在14分钟前询问
弗拉基米尔1tuga
服务通常不接收窗口消息.它们根本不一定有窗口把手.即使他们这样做,他们也会在一个单独的桌面上运行.程序无法将消息从一个桌面发送到另一个桌面,因此服务只能接收来自其他服务或服务启动的程序的消息.
在Windows Vista之前,您可以将服务配置为与桌面交互.这使得服务在与登录用户相同的桌面上运行,因此以该用户身份运行的程序可以向服务的窗口发送消息.但是Windows Vista隔离了服务; 他们不能再与任何用户的桌面交互.
还有许多其他方式与服务进行通信.它们包括命名管道,邮件槽,内存映射文件,信号量,事件和套接字.
例如,使用套接字,您的服务可以在开放端口上侦听,需要与之通信的程序可以连接到该端口.这可以打开远程管理的大门,但您也可以将服务限制为仅侦听本地连接.
以上所有都试图告诉你,你采取了错误的方法.但也有问题在于手头.您的程序在调试器中表现出一种方式,而在其他方面则表现不同.如果没有安装,你如何调试服务?您的服务运行的用户帐户是什么?你的调试器?您尝试了哪些不涉及调试器的调试技术(例如writeln
,用于跟踪程序操作的日志文件)?
当你说它"使用"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()返回,然后返回循环的开头.