同じレンダリングレイヤーにフォーム要素を埋め込むために、いくつかのハッカーを使用してWPFアプリケーションを構築しています。基本的に、私が行うことは、フォームを画面外にレンダリングし、WPFイメージにフォームのモックアップを作成することです。また、フォームモックアップ宛ての場合にWPFアプリケーションからイベントを盗み、代わりにPostMessage(...)を使用してイベントを非表示のフォーム要素に送信する低レベルのマウスフックもあります。
イベントを食べることを示すゼロ以外の値をフックプロシージャから返すと(キュー内のすべてのマウスフックを呼び出したとしても)、カーソルが1つの位置に留まります。これは、イベントが到達していないある種のWPFアプリケーション層でカーソル位置が処理されるためだと思います。
カーソルの位置を自分で設定するだけでよいので、WPFアプリケーションがイベントをまったく認識しないようにするのは問題ないと思いました。結局のところ、マウスイベントには座標が付加されています。残念ながら、これらのマウスの座標はひどく間違っているようです。実際、カーソルがどこにあっても、常に同じ座標を受け取ります。
これが私のコードです:
if (nCode >= 0){
MOUSEHOOKSTRUCT_LL mousehookstruct_ll1 =
((MOUSEHOOKSTRUCT_LL)Marshal.PtrToStructure(((IntPtr)lParam), typeof(MOUSEHOOKSTRUCT_LL)));
if (mousehookstruct_ll1 != null) {
if ((user != null) && user.SystemMouseHookProc(nCode, wParam, lParam, new Point(mousehookstruct_ll1.pt_x, mousehookstruct_ll1.pt_y), mousehookstruct_ll1.dwExtraInfo)) {
return new IntPtr(1);// CallNextHookEx(this.MessageHookHandle, 1, wParam, lParam);// It doesn't matter that I don't call CallNextHook here.
}
}
}
GC.KeepAlive(this);
return CallNextHookEx(this.MessageHookHandle, nCode, wParam, lParam);
}
次に、user.SystemMouseHookProc(...)で、正しいカーソル位置に続いてマウスフックで引っ張られた座標を出力します。出力は、常に次のようになります。
カーソル:523,578
{X = 1985777551、Y =1985777602}//この座標は変更されません
その出力は明らかに間違っています。マウスフックから正しいマウス座標を取得するにはどうすればよいですか?
ありがとうございました。
PSこのソリューションは、オンラインで人気のあるソリューションから派生しています。残念ながら、そのソリューションは私のニーズを満たしていないため、この形式に変更する必要がありました。