2011-07-06 13 views
1

プロセスAを起動してプロセスBを起動します。マウスカーソルをAにロードし、マウスがA上にあるときにマウスカーソルを変更しますBウィンドウ。出来ますか?Windows上の別のプロセスからウィンドウ上のマウスカーソルを変更する

マウスがBを超えたときにAからSetCursorに電話をかけようとしましたが、BでWM_SETCURSORメッセージを処理しても、カーソルは決して変更されません。何か不足していますか?

答えて

2

マウスが別のウィンドウの上にあるときにウィンドウを制御できる唯一の方法は、マウスをキャプチャすること(SetCaptureを参照)、またはシステムマウスを設定することですが、後者を実行することを非常に疑います。

残念ながら、マウスをキャプチャすると、マウスのイベントはウィンドウに送信され、マウスのイベントはウィンドウに表示されず、GUIは使用できなくなります。

唯一の他の解決策は、WM_MOUSEMOVEやSetCursorなどのメッセージをアプリケーション自体から管理するAPIへのフックとコードインジェクションです。プロセス間通信の何らかの方法を使用してアプリケーションAから設定するカーソルを取得する可能性があります。

+0

AはSetCaptureを使用しても問題はありません。なぜなら、Aはすでにイベントとウィンドウ上の描画を処理しているからです。しかし問題は、SetCaptureがトップレベルのウィンドウでのみ動作するように見えることです。 – Jazz

1

アプリケーションは、独自のカーソルを制御します。 AからできないSetCursor()を呼び出すことはおそらくできません。 SetCursor()には、どのアプリケーションを変更するかを指定するパラメータはありません。これは、呼び出し元アプリケーションで変更が行われたためです。

希望の変更を行うには、Bにコードを注入する必要があります。

+0

コードを注入するのではなく、Bにコードをコード化することができます。しかし、問題は、私のカーソルがBではなくAにロードされているため、データをBに注入する必要があることです。 – Jazz

+0

あなたはBでロードする方法を見つけなければなりません。 –

+0

私はこれを避けたいと思っていましたが、他の選択肢がないようです。 – Jazz

1

SetClassLongを使用して子プロセスのデフォルトカーソルを変更することができます。GCL_HCURSOR。これは子がSetCursorを使用して明示的に独自のカーソルを変更したときに表示される内容には影響しません。他に何も指定されていないときに表示されるデフォルトです。警告:プログラムがデフォルトのカーソルをまったく表示しない可能性があります。この場合、何の効果もありません。

+0

私はすでにtryiedですが、私のカーソルがAにロードされているので、ハンドルがBでは無効であると思われますので、動作しません。 – Jazz

関連する問題