1

ウィンドウメッセージをフックして困っています。ウィンドウのテキスト (キャプション) の変更を検出する必要があるため、対象のウィンドウの WM_SETTEXT メッセージをインターセプトします (ウィンドウの作成時にウィンドウのキャプションが指定されていないため、これを行います)。

WM_SETTEXTドキュメントのドキュメントを読むと、 lParamパラメータはウィンドウ テキストを表す文字列へのポインタを指定します。

メッセージは、SendMessage を使用して .NET アプリケーションに転送されます。.NET アプリケーションで行うことは次のとおりです。

private static bool ProcessMessage(ref Message msg) {
    ...
    string s = Marshal.PtrToStringAuto(msg.LParam) *
}

ここで、ProcessMessage は、.NET フォームのメッセージを処理するルーチンです。

私がいつも得るのは空の文字列です。これは期待される結果ではありません。他の Marshal.PtrToString* メソッドを試しましたが、誰も機能しませんでした。

IntPtrからStringへの変換で何が間違っていますか?

(*) すべての Windows メッセージが傍受されるため、システム全体がブロックされるため、このコードをデバッグできないことに注意してください。

4

2 に答える 2

2

LParam は文字列ポインターであり、WM_SETTEXT メッセージが送信されたのと同じプロセスで実行されると仮定すると、コードは正しいです。別のプロセスでは、このポインターは無効であり、このポインターを使用した結果は未定義です。

于 2010-08-24T11:04:29.550 に答える
-1

おそらく、文字のポインターへのポインターです。

したがって、IntPtrを読み取り、IntPtrでもあるIntPtrの値を読み取り、それを使用します。

うまくいくかもしれないし、うまくいかないかもしれない:p

于 2010-08-24T10:59:54.380 に答える