2014-09-04 119 views
1

我想开发一个应用程序,将挂钩到Windows事件并通知我何时例如。活动窗口已更改。我正在使用Win7 64与.net 4.0 VS 2010
为此,我制作了一个Window Service类型的项目,在其中创建了一个服务安装程序,并使用从User32.dll中注册到事件的模板服务项目中的OnStart方法使用SetWinEventHook 。除了传递给SetWinEventHook的回调方法中没有收到任何东西外,一切看起来都很好。 我的代码如下所示:从C#窗口服务应用程序挂钩窗口事件不起作用

protected override void OnStart(string[] args) 
{ 
    workerThread = new Thread(OnTimer); 
    workerThread.Start(); 
} 

public void OnTimer() 
{ 
     UserWatchdog userWatchdog = new UserWatchdog(); 
     UserWatchdog.SubscribeToWindowEvents(); 
     ScreenTime.EventLoop.Run(); 
} 
public static WinEventProc _winEventProc = new WinEventProc(WindowEventCallback); 
public static void SubscribeToWindowEvents() 
    { 
     if (windowEventHook == IntPtr.Zero) 
     { 
      windowEventHook = SetWinEventHook(
      0x00000001, 
      0x7FFFFFFF, 
      IntPtr.Zero,    // hmodWinEventProc 
      _winEventProc, 
      0,      // idProcess 
      0,      // idThread 
      WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS); 
     } 
    } 
    private static void WindowEventCallback(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) 
    { 
     //I NEVER GET HERE 
     ScreenTime.WatchdogAnalyzer.analyze(hwnd); 
    } 

    public static void Run() 
    { 

     MSG msg; 
     while (!_shouldStop) 
     { 
      WatchdogAnalyzer.printActiveWindow(); 
      if (PeekMessage(out msg, IntPtr.Zero, 0, 0, PM_REMOVE)) 
      { 
       if (msg.Message == WM_QUIT) 
        break; 
       TranslateMessage(ref msg); 
       DispatchMessage(ref msg); 
      } 
     } 
    } 

你有任何想法,为什么我没有得到任何来自运事件? 谢谢

+1

就像大卫说的,你不想实现这个作为Windows服务。只需制作一个普通的Windows程序,也许没有UI,然后让用户通过将其包含在他/她的Startup文件夹或通过自动启动程序的注册表项中来运行它。 – RenniePet 2014-09-04 14:11:52

回答

2

服务在不同的用户应用程序上运行在不同的Window Station(桌面)上。即使没有服务,也可能有几个窗口站(RDP,UAC等)。

您需要在用户的本地桌面上运行进程并使用它来捕获事件。然后它可以与服务进行通信。

1

什么@DavidCrowell说,再加上你可能能够利用这个属性的服务(没试过):

enter image description here

this MS page

在大多数情况下, ,建议您不要更改允许服务 与桌面设置进行交互。如果允许服务与桌面交互 ,则该服务在桌面上显示的任何信息也将显示在交互式用户的桌面上。然后,恶意用户可以从交互式桌面获取对该服务的控制权或攻击它 。

因为这意味着两个桌面上的窗口之间的交互,所以如果您在服务上设置此属性,则可以使用您的挂钩。

+1

我不确定,但我认为这不会影响OP的目的。该服务可能能够与桌面进行交互,但我不认为它与用户使用的是相同的Windows桌面。 – RenniePet 2014-09-04 14:22:09

+0

阅读此:http://msdn.microsoft.com/en-us/library/aa983650(v=vs.71).aspx我发现大卫克罗威尔说,他们在不同的窗口站运行,所以我无法得到另一个车站的窗户。谢谢 – Lucian 2014-09-05 07:07:21