Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何终止来自服务的非托管消息框调用_C#_Windows Services - Fatal编程技术网

C# 如何终止来自服务的非托管消息框调用

C# 如何终止来自服务的非托管消息框调用,c#,windows-services,C#,Windows Services,我有一个调用非托管dll的服务。在某个代码路径上,它将打开一个消息框。因为它是一个服务,所以没有显示实际的窗口,但是线程仍然被阻塞 如何自动关闭该消息框?实际上,该消息框会显示,但不会显示在交互式窗口站上,因此任何登录用户都看不到。您有几个选择: 您可以使服务具有交互性。这将允许它向当前登录的用户显示一个消息框。MSDN有一些关于的信息 您可以钩住MessageBox导出并将其重定向到您自己的代码。这可以使用低级Windows API函数来完成 有趣的问题是,如果您计划从没有UI的服务中使用d

我有一个调用非托管dll的服务。在某个代码路径上,它将打开一个消息框。因为它是一个服务,所以没有显示实际的窗口,但是线程仍然被阻塞


如何自动关闭该消息框?

实际上,该消息框会显示,但不会显示在交互式窗口站上,因此任何登录用户都看不到。您有几个选择:

  • 您可以使服务具有交互性。这将允许它向当前登录的用户显示一个消息框。MSDN有一些关于的信息

  • 您可以钩住MessageBox导出并将其重定向到您自己的代码。这可以使用低级Windows API函数来完成


有趣的问题是,如果您计划从没有UI的服务中使用dll,则不应显示任何MsgBox,我实际上也有类似的问题,我们使用第三方库,而不是引发异常并让我捕获它,而是显示一个消息框,并且不会引发异常。最佳解决方案是联系dll的作者,要求删除messagebox调用或提供一个不显示它的重载。最佳解决方案是只需要源代码,然后自己修复:)。不幸的是,选项是杀死它或修补dll。这有帮助吗?“当前登录的用户”是指正在查看桌面的普通用户,还是指正在运行桌面的服务帐户?另外:你能告诉我挂MessageBox的正确方向吗?Windows有窗口站的概念,服务通常在非交互式窗口站中运行,没有任何用户响应MessageBox。但是,您可以强制服务与当前登录用户的窗口站进行交互。您必须研究文档以了解确切的细节。很多年前我确实钩住了MessageBoxA,但是我忘记了细节。我相信是Matt Pietrek在他的MSDN专栏中为我提供了必要的信息。谢谢,我将在另一个问题中寻求帮助:)似乎搜索windows API挂钩会让你找到关于黑客等的可疑网站。但是,当我使用
MessageBoxA
hook时,它非常简单,尽管有点晦涩。如果我没记错的话,我必须重定向一个指针,可能是加载到进程中的USER32.DLL的PE头导出表中的指针。还是在“坏”DLL的导入表中?