2009-11-04 56 views
1

桌面應用程序(用Delphi編寫)由用戶A啓動。我們稱之爲「實例A」。將消息發送到由不同窗口的用戶會話啓動的應用程序

用戶A不處於 「切換用戶」 和用戶B的日誌。

用戶B運行相同的應用程序。讓我們把它叫做「實例B」

我現在想,是爲實例B的方式將消息發送到實例A.

我試過如下:實例A在一個文件中寫入其手柄,所以實例B可以打開該文件,讀取句柄並使用它向實例A發送消息,但它不起作用 - 可能出於安全原因,Windows不允許一個用戶訪問另一個用戶正在運行的進程的句柄。 ..

這樣做的一個「壞」方法是讓實例A每隔幾秒檢查一次特定的文件或註冊表位置,以便實例B可以在那裏寫入內容並且實例A會得到它......但這是顯然是一種負擔和不安全t解決方案。

取而代之,我需要的是用戶B的實例B向用戶A的實例A發送無害消息的方式,此後實例A醒來並決定接下來要做什麼。

感謝您的任何建議!

回答

2

您不能使用SendMessage,PostMessage和類似的函數,因爲來自不同用戶會話的應用程序實例不適用於您的應用程序。

你可以使用的是全局命名空間中的命名管道,信號量等(即名稱前綴爲「全局」)。然後,在應用程序中創建一個單獨的線程,例如,休眠直到其中一個「信號」到達並相應地通知主窗口。

爲了節省資源,使用WTSRegisterSessionNotification在會話切換髮生時得到通知,並僅在該點創建線程。

點擊此處瞭解詳情: http://support.microsoft.com/kb/310153 這裏: http://msdn.microsoft.com/en-us/library/ms997634.aspx

1

難道這與在系統帳戶下運行windows服務並讓某個應用程序的用戶實例與其通信有着同樣的問題嗎?那麼也許你應該谷歌進行進程間通信(命名管道等)。

你也可能使用UDP或TCP/IP,但我想使用命名管道更適合「本地」通信(儘管我從來沒有真正做到過)。

閱讀關於在MSDN上命名管道的here

+0

感謝命名管道的末端,這可能是確實做了正確的方式。 – 2009-11-04 17:25:44

相關問題