我在挂钩赢活动和使用回调赶窗口事件,像这样的.NET 4.0开发的应用:
//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,
0, // idProcess
0, // idThread
WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
//define somthing in callback
private static void WindowEventCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime)
{
Logger.Instance.Write("WindowEventCallback");
}
//the loop that reads the messages
while (true)
{
if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE))
{
if (msg.Message == WM_QUIT)
break;
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
}
此代码工作完美,当应用程序被配置为一个控制台应用程序。 但我希望它作为服务运行,所以我改变了一下循环,因为我们不能在服务的OnStart方法连续循环。 于是我做了一个定时器,在像这样一个50毫秒的间隔读取消息:
MSG msg;
if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE))
{
TranslateMessage(ref msg);
DispatchMessage(ref msg);
}
//
我也改变了整个应用程序,我创建了一个新的项目作为一个窗口服务创建的服务安装程序,并使其运行。 它运行OK作为一种服务,但我没有得到事件的通知。 我的假设是,有运行的应用程序作为服务时,一些问题与Windows权限。
应用程序是使用Visual Studio Win7上64发2010 .NET 4.0
你对我为什么不赶在活动通知的任何想法?
谢谢