2012-11-05 49 views
0

我正在使用一些代碼,如Get active window text (and send more text to it)將密鑰發送到前臺窗口。當我從控制檯運行它時,它工作得很好。當我從我的服務運行它時,GetForegroundWindow()調用返回0(零)。我如何從我的服務中獲得前景窗口句柄?如何從Windows服務獲取前臺窗口?

編輯:一點研究告訴我關於作爲不同會話運行的服務 - 如果這與我的問題有關,我需要知道如何獲取控制檯(物理監視器)會話的前景窗口(如果存在)。

編輯#2:我的用例只涉及XP。

+0

從Windows Vista開始,服務無法直接與控制檯會話進行交互。但是,您可以在該會話中啓動一個子流程來代表您完成工作。我建議你先查找WTSGetActiveConsoleSessionId。 –

回答

1

如果設置

允許服務與桌面交互服務屬性中(登錄選項卡)

複選框好於XP GetForegroundWindow會工作。這不適用於Vista和更新版本。

但是你不應該那樣做,實際上你不應該從服務中調用GetForegroundWindow,即使在沒有用戶登錄的情況下也可以運行服務,而且當有多個用戶登錄時它們也可以工作。

我不知道你爲什麼要從windows服務中這樣做,但也許隱藏在托盤中的簡單的桌面應用程序可以做到這一點。

+0

我正在創建一個「鍵盤楔形」程序,以從條形碼掃描儀獲取數據並將其發送給其他應用程序。它的系統可能有多個用戶登錄,但只有物理工作站的用戶纔會使用條形碼掃描器(顯而易見)。我不確定如果有多個用戶登錄會發生什麼情況......我只是想把他放入開始菜單,但擔心如果有人遠程登錄,應用程序將從該會話開始,這是不正確的。 – Aerik

+2

將應用程序放入「開始」菜單可能會更簡單,但它會檢查它是否在物理控制檯上,如果沒有,則退出。 WTSGetActiveConsoleSessionId函數應該是你的朋友。 –

+0

感謝哈利 - 這是偉大的建議,這是我終於結束的道路。 – Aerik

相關問題