微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当应用程序是服务时,SetWinEventHookcallback不起作用

我有一个在.NET 4.0中制作的应用程序挂钩赢得事件,并使用callback来捕获窗口事件,如下所示:

//import the methos from the dll [DllImport("user32.dll",SetLastError = true)] private static extern IntPtr SetWinEventHook(int eventMin,int eventMax,IntPtr hmodWinEventProc,WinEventProc lpfnWinEventProc,int idProcess,int idThread,int dwflags); //declare a callback public static WinEventProc _winEventProc = new WinEventProc(WindowEventCallback); //pass this callback to SetWinEventHook SetWinEventHook( EVENT_SYstem_FOREGROUND,// eventMin EVENT_SYstem_FOREGROUND,// eventMax IntPtr.Zero,// hmodWinEventProc _winEventProc,// idProcess 0,// idThread WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); //define somthing in callback private static void WindowEventCallback(IntPtr hWinEventHook,uint eventType,IntPtr hwnd,int i@R_404_6435@ject,int idChild,uint dwEventThread,uint dwmsEventTime) { Logger.Instance.Write("WindowEventCallback"); } //the loop that reads the messages while (true) { if (PeekMessage(out msg,IntPtr.Zero,PM_REMOVE)) { if (msg.Message == WM_QUIT) break; TranslateMessage(ref msg); dispatchMessage(ref msg); } }

当应用程序configuration为控制台应用程序时,此代码完美工作。 但我希望它作为服务运行,所以我改变了一点循环,因为我们不能在服务的OnStart方法中有一个连续的循环。 所以我做了一个计时器,以50毫秒的间隔读取消息,如下所示:

MSG msg; if (PeekMessage(out msg,PM_REMOVE)) { TranslateMessage(ref msg); dispatchMessage(ref msg); } //

我也改变了整个应用程序,我创build了一个新的项目作为一个窗口服务创build一个安装程序的服务,并使其运行。 它作为服务运行正常,但我没有得到事件通知。 我的假设是,在将应用程序作为服务运行时,Windows权限存在一些问题。

该应用程序是在Win7 64与Visual Studio 2010 .NET 4.0

你有什么想法,为什么我不赶上事件通知

谢谢

如何将MS Windows操作系统版本号转换为.NET中的产品名称

如何确定给定COM库的线程模型?

作为另一个用户启动Windows进程,而不直接知道密码

如何禁用.NET Frameworkexception处理并使用我自己的呢?

重置Windows Server 2008 R2上的密码

非COM,非.NET DLL的正确名称

如何从C#读取PowerShell脚本stdout和stderr

如何调用在C#中的Windows屏幕保护程序?

获取磁盘和/或具有未知文件格式的驱动器的大小,C#.NET框架?

帮助修复C#中的错误“引用或失败参数必须是可赋值的”

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐