2016-06-12 21 views
0

私は、他のプログラム(AとB)のTreeViewに対してTreeView_GetRoot(TVM_GETNEXTITEMメッセージ)を呼び出すのと同じコード(プログラムC)を使ってそれらを操作しようとしています。リモートウィンドウはメッセージを受信しません

プログラムAはメッセージを受け取ることができます(私はspy ++からのメッセージを見ることができます)。

しかし、プログラムBでは、メッセージを受け取ることができないようですが、戻り値はVCデバッグウィンドウから '未定義'ですが、spy ++ではメッセージが表示されません。 (Spy ++はTreeViewを手動でクリックするとメッセージが正しく表示されます)

2つのプログラムとspy ++はどちらも32ビットです。

さらに、Winspector(Spy ++のような)は、プログラムAのTreeViewの項目数を表示できますが、プログラムBの項目数は表示できません。

可能性はありますか?

+1

*メッセージは*メッセージを送信していますか?プログラムA?あるいは全く別のプログラム? –

+4

UIPI([Windows Integrity Mechanism Design](https://msdn.microsoft.com/en-us/library/bb625963.aspx)を参照してください)。 – IInspectable

+0

@CodyGray別のプログラムです。それがCだとしましょう。 – user1633272

答えて

2

SendMessageノートのドキュメント、送信そのメッセージは、(Windows Integrity Mechanism Design参照)UIPIの対象となる:送信

メッセージUIPIを受けます。プロセスのスレッドは、より小さいか等しい整合性レベルのプロセスのスレッドのメッセージキューにのみメッセージを送信できます。

ドキュメントもUIPI違反に起因するエラーが報告されているか、ノート:

メッセージがUIPIで GetLastErrorで取得した最後のエラーを、ブロックされている

は、5(アクセス拒否)に設定されています。

次のリストの潜在的解決策:

  • 使用UI Automation。特定の条件下では、UIオートメーションプログラムはUIPIの制限を回避できます。
  • 制御アプリケーションをより高い整合性レベルで実行します。これは推奨されていないため、最後の手段としてのみ使用する必要があります。
+0

UIオートメーションはターゲットプログラム(BおよびC)を変更する必要がありますか?彼らは私のコントロール下にありません。 – user1633272

+1

@ user1633272:UIオートメーションでは、ターゲットプログラムが必要なインターフェイスを公開する必要があります。これは、すべての標準的なWindowsコントロールだけでなく、いくつかのフレームワーク(MFC、標準コントロール、Qtなどをラップするため自然です)にも当てはまります。特定のプログラムが必要なインターフェイスを公開しているかどうかを調べるには、[Inspect tool](https://msdn.microsoft.com/en-us/library/windows/desktop/dd318521.aspx)を参照してください。 – IInspectable

+0

Inspect.exeからコントロールとその値を見ることができます。私はそれがUIオートメーションによって行うことができると思います。どうもありがとう。 – user1633272

関連する問題