1

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

弗拉基米尔 1tuga

4

3 回答 3

7

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

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

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

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

以上所有内容都试图告诉您您采取了错误的方法。但也有手头的问题。您的程序在调试器中以一种方式运行,而在调试器外部以另一种方式运行。如果未安装,您首先如何调试该服务?您的服务以什么用户帐户运行?你的调试器?您尝试过哪些不涉及调试器的调试技术(例如writeln,使用日志文件跟踪程序的操作)?

于 2008-12-10T16:44:57.240 回答
5

当您说它“使用”Windows 消息系统时,您是什么意思?您是否正在使用或发送 Windows 消息?

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

什么是消息循环(单击标题以转到此信息的来源)

while(GetMessage(&Msg, NULL, 0, 0) > 0)
{
    TranslateMessage(&Msg);
    DispatchMessage(&Msg);
}
  1. 消息循环调用 GetMessage(),它在您的消息队列中查找。如果消息队列为空,您的程序基本上会停止并等待一个(它阻塞)。
  2. 当发生事件导致消息被添加到队列时(例如系统注册鼠标单击) GetMessages() 返回一个正值,表示有消息要处理,并且它已经填充了 MSG 的成员结构我们通过了它。如果命中 WM_QUIT 则返回 0,如果发生错误则返回负值。
  3. 我们获取消息(在 Msg 变量中)并将其传递给 TranslateMessage(),这会进行一些额外的处理,将虚拟键消息转换为字符消息。这一步实际上是可选的,但如果它不存在,某些事情将无法工作。
  4. 完成后,我们将消息传递给 DispatchMessage()。DispatchMessage() 所做的是获取消息,检查它是针对哪个窗口的,然后查找该窗口的窗口过程。然后它调用该过程,将窗口句柄、消息以及 wParam 和 lParam 作为参数发送。
  5. 在您的窗口过程中,您检查消息及其参数,然后对它们做任何您想做的事情!如果您不处理特定消息,您几乎总是调用 DefWindowProc() 它将为您执行默认操作(这通常意味着它什么都不做)。
  6. 处理完消息后,您的 windows 过程返回,DispatchMessage() 返回,然后我们回到循环的开头。
于 2008-12-10T16:37:55.260 回答
0

谢谢大家的回答,问题是操作系统(vista),我用我的windows 2000测试过,一切正常。

谢谢你的光罗。

于 2008-12-10T18:21:59.307 回答