2011-07-14 7 views
2

私はプログラムをタッチスクリーンで実行していますが、マウスポインタが「オン」になるとタッチスクリーンに問題が発生するため、タッチスクリーンのWindowsマウスの動作は無効になります。自家製プログラムは、タッチスクリーンを監視し、画面が触れられたか触れられていない場所(すなわち、WM_LBUTTONDOWNWM_LBUTTONUP)の場所のウィンドウにメッセージを投稿するために使用されている。WindowsのC++からのマウスイベントをシミュレートする

関連するコードは次のようになります。

touched = false; 

while (1) 
{ 
    if (!touched) { 
     // p.x and p.y calculated here based on mouse position at 
     // time of touch screen event 
     p.x = ...; 
     p.y = ...; 

     if ((window = WindowFromPoint (p)) != NULL) 
      PostMessage (window, WM_LBUTTONDOWN, 0, 0); 

     touched = true; 
    } 
    else 
    { 
     if ((window = WindowFromPoint (p)) != NULL) 
      PostMessage (window, WM_LBUTTONUP, 0, 0); 

     touched = false; 
    } 
} 

これは動作しますが、ない正確に模倣Windowsのマウスのプレス動作を行います - に関係なく、アンタッチは(発生したタッチの位置のすなわち場合タッチがドラッグされた場合)、WM_LBUTTONUPWM_LBUTTONDOWNを受け取ったコントロールに送信されます。

私がやっていることは、Windowsのようにすることでした。どのアプリケーションでも、ボタンがあるダイアログを開きます。ボタンをクリックしたままにすると、そのボタンが押されています。マウスをボタンの外にドラッグし、マウスを離さないとボタンが再び上がるのがわかります。マウスをボタンの上にドラッグすると、そのボタンが押し下げられます。ポインターがボタン上にあるときにマウスを放すと、ボタンが押されます。ポインターがボタンの外にあるときにマウスを放すと、ボタンは押されません。

Iは低レベルのマウスフックを設定し、マウスをオンまたはオフに解除されたかどうかを、このシーケンス中に発生する唯一のマウスイベントは関係なく、WM_LBUTTONUP続いWM_MOUSEMOVE一連続いWM_LBUTTONDOWNであることがわかりますボタン。

マウスをドラッグしたときの代替処理を追加しようとしましたが、投稿メッセージWM_MOUSEMOVEがありますが、これを送信する必要がありますか? WM_LBUTTONDOWNイベントが最初に送信されたボタン、または他の場所に送信されたボタン私は、ボタンとボタンがオンのウィンドウの両方を試しましたが、明らかに私はうまくいきませんでした。私が達成できた最高のことは、ボタンを離したときにタッチスクリーンボタンが「クリック」されないことですが、タッチスクリーンボタンはまだ押されています。

提案がありますか?

この操作中に送信するイベントを誰でも確認できますか?

ありがとうございました。

+0

私はこの質問をチェックしましたか:http://stackoverflow.com/questions/5164774/how-can-i-simulate-mouse-events-from-code – iammilind

+0

私はSendInputを試しましたが、問題はSendInputです。私は間違ったことをしました)私が送信したマウスイベントが実際に起こったかのようにマウスポインタを反応させます - マウスクリックを別の場所に送信すると、マウスは実際に他の場所に移動します。私がしようとしているのは、マウスが実際にクリックまたはドラッグされたかのように、適切なコントロールに基になるWM_LBUTTONDOWN、WM_MOUSEMOVEおよびWM_LBUTTONUPメッセージ(およびその他のメッセージがある場合)を送信することですそこにマウスポインタを動かすことなく。 – Mark

+0

マウスポインタを非表示にするには、マウスポインタを目に見えないものに設定するのが最善の方法です。SendInputを使用する代わりにWM_メッセージを使用すると、ターゲットアプリケーションがGetCursorPosまたはGet [Async] KeyStateを使用してマウスの位置やボタンの状態を確認すると、偽造しようとしているものではなく実際の状態になります。 (また、アプリケーションがウィンドウprocではなくフックやメッセージループで入力を処理しているような奇妙な処理をしている場合は、代わりにメッセージを投稿すると機能しない可能性があります)。しかし、場合は、それを計画することができます。 – BrendanMcK

答えて

0

これはあなたのコードです:

PostMessage (window, WM_LBUTTONDOWN, 0, 0); 

あなたの代わりに上記の行のこれを試すことができます:

DWORD dw = MAKEWORD(p.x, p.y); 
    PostMessage (window, WM_LBUTTONDOWN, MK_LBUTTON, dw); 

私はこのコードは動作するはずだと思います。

+0

MAKEWORDはバイトから単語を作成します... Windowsマウスボタンメッセージが実際にLPARAMを取るが、少なくともMAKELONGは必要です:http://stackoverflow.com/questions/8490389/wm-mousemove-packing-x-and-y-positions/8490518#8490518 – HostileFork

関連する問題