2013-03-12 28 views
0

我已經創建了一個Windows服務來使用createProcessAsUser運行我的自定義應用程序。結果是一個應用程序以SYSTEM用戶身份在會話ID 0中運行,正如我所期望的那樣。我的問題是,我需要在該應用程序與當前用戶創建的其他應用程序之間進行一些通信。如何將用戶應用程序的自定義消息發送到SYSTEM應用程序?

如果一些桌面事件發生(SC_SCREENSAVE,關閉),當前用戶應用程序捕獲的事件,我需要告訴我的SYSTEM應用程序。我已經使用:

SendMessage(HWND_BROADCAST,CURRENT_USER_HAS_DONE_SOMETHING,0,0);

即使SYSTEM應用程序捕獲了很多系統事件(掛起,註銷...),並且運行在相同的會話ID中,我的自定義消息也不會被捕獲。看起來像Sendmessage不適用於SYSTEM用戶。

如何從用戶當前會話向SYSTEM應用程序發送消息?

回答

2

另一種選擇是使用舊的ControlService function以及用戶定義的控制代碼。它不適合複雜的通信(你不能將任何參數傳遞給服務),但它適用於你所描述的簡單的「發生的事情」通知。

+0

就是這樣!控制服務正是我想要的。我已經使用OpenSCManager打開了服務,使用SC_MANAGER_CONNECT訪問權限,然後使用SERVICE_USER_DEFINED_CONTROL訪問OpenService,並簡單地調用ControlService來解決問題。即使用戶沒有特權,它也可以工作,這非常完美。非常感謝@CoreTech。 – tarsus04 2013-03-13 08:24:02

+0

+1不知道 – 2013-03-13 08:31:08

1

最近的Windows版本不允許在會話0和桌面會話之間交換消息。這被稱爲Session 0 isolation

你可以找到更多信息herehere

常見的替代方法是在this SO answer中描述的TCP/IP,管道,遠程處理等。

+0

非常感謝Zdeslav。我要閱讀你的鏈接。當我得到解決方案時,我會再次發佈。非常感謝。 – tarsus04 2013-03-12 10:43:29

1

很明顯,廣播消息不是正確的解決方案。更好的解決方案可能是CreateEventEx。這會創建一個命名事件。您的常規應用程序然後可以撥打SetEventSYSTEM應用程序可以等待此事件。

+0

非常感謝您的回答!我現在要處理它。 – tarsus04 2013-03-12 10:41:54

相關問題