2016-06-12 98 views
0

我試圖使用相同的代碼(程序C)調用TreeView_GetRoot(TVM_GETNEXTITEM消息)對其他程序(A和B)中的TreeView來操作它們。遠程窗口不會收到消息

程序A可以收到消息(我可以從間諜++看到消息)。

但是對於程序B,似乎無法收到消息,VC調試窗口返回的值是'undefined',同時間諜++中沒有消息顯示。 (Spy ++正常顯示消息,用於手動點擊TreeView)

這兩個程序和spy ++都是32位。此外,Winspector(如spy ++)可以在程序A中顯示TreeView的項目數量,但不會在程序B中顯示該項目。我懷疑它是由同樣的原因引起的。

你知道它有什麼可能嗎?

+1

哪個程序是*發送*消息?程序A?或者完全不同的程序? –

+4

UIPI(請參閱[Windows完整性機制設計](https://msdn.microsoft.com/zh-cn/library/bb625963.aspx))。 – IInspectable

+0

@CodyGray一個不同的程序。我們假設它是C. – user1633272

回答

2

SendMessage筆記文檔,即消息發送受UIPI(見Windows Integrity Mechanism Design):

消息發送受UIPI。進程的線程只能將消息發送到完整性級別較低或相同的進程中的線程的消息隊列。

的文件也指出,如何因UIPI違規錯誤報告:

當通過UIPI封鎖消息的最後一個錯誤,用GetLastError檢索,被設定爲5(拒絕訪問)。

下面列出了可能的解決方案:

  • 使用UI Automation。在某些情況下,UI自動化程序可以繞過UIPI限制。
  • 以更高的完整性級別運行控制應用程序。這不被推薦,應該被看作是最後的手段。
+0

UI自動化是否需要修改目標程序(B和C)?他們不受我控制。 – user1633272

+1

@ user1633272:UI Automation要求目標程序公開所需的接口。對於所有標準的Windows控件,以及幾個框架(MFC,當然,因爲它包裝了標準控件,Qt等等),這是正確的。要調查特定程序是否暴露必要的界面,請使用[檢查工具](https://msdn.microsoft.com/en-us/library/windows/desktop/dd318521.aspx)查找。 – IInspectable

+0

我可以從Inspect.exe中看到控件及其值。我認爲這可以通過UI自動化完成。非常感謝。 – user1633272

相關問題