2014-09-04 185 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