動的にマウスをクリックするには?

解決


ミミ  2004-09-08 00:31:17  No: 10825

プログラム中で,マウスを使わずにマウスをクリックしたいと考えています.今現在,以下のようにコードを書いています.
スクリーン座標系の座標(10, 10)をクリックしたいと考えています.

SendMessage(HWND_DESKTOP, WM_LBUTTONDOWN, 0, MakeLParam(10, 10));
SendMessage(HWND_DESKTOP, WM_LBUTTONUP, 0, MakeLParam(10, 10));

このように書いても,何も起きません.

そして,wparam, lparamの指定方法が良く分かりません.この質問から,皆さんお分かりかと思いますが,プログラム初心者です.
どなたかご教授お願いします.


SO  2004-09-08 00:53:46  No: 10826

勝手にリンクですが、http://yokohama.cool.ne.jp/chokuto/urawaza/api/SendMessage.html


ミミ  2004-09-08 01:55:29  No: 10827

SOさん,ごめんなさい.リンク先のページを参照しても,何だか良く分かりません.
試しに,フォームをもう一つ作り,もう一つのフォームをクリックするように試しました.

// Form1内

SendMessage(Form2.Handle, WM_LBUTTONDOWN, 0, MakeLParam(10, 10));
SendMessage(Form2.Handle, WM_LBUTTONUP, 0, MakeLParam(10, 10));

でも,下に隠れているウインドウがクリックされたような様子はありません.


Mr.XRAY  URL  2004-09-08 06:43:45  No: 10828

スクリーン座標のどこかをクリックする,という目的だけであれば,
Mouse_Eventを使用する方法があります.
詳細は,Win32APIのヘルプを調べて下さい.

//====================================================================
//  Mouse_Eventによる画面上の任意位置のクリック
//  Mouse_Eventでマウスの座標値を絶対値で指定する場合,
//  画面の左上が(0,0),右下が((65537,65535)となる
//====================================================================
procedure TForm1.Button1Click(Sender: TObject);
var
     dwFlags : DWORD;
     X,Y : Integer;
begin
     dwFlags:=MOUSEEVENTF_MOVE or MOUSEEVENTF_ABSOLUTE;
     {(対象座標値を(300,200)とした場合}
     X:=Trunc(300/Screen.Width*65537);
     Y:=Trunc(200/Screen.Height*65535);
     dwFlags:=MOUSEEVENTF_MOVE+MOUSEEVENTF_LEFTDOWN+MOUSEEVENTF_ABSOLUTE;

     {まず移動}
     Mouse_Event(dwFlags,X,Y,0,0);
     {クリック}
     Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
     Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
end;


Mr.XRAY  URL  2004-09-08 06:48:27  No: 10829

ゴメンなさい.間違えました.訂正コードです.

//====================================================================
//  Mouse_Eventによる画面上の任意位置のクリック
//  Mouse_Eventでマウスの座標値を絶対値で指定する場合,
//  画面の左上が(0,0),右下が((65537,65535)となる
//====================================================================
procedure TForm1.Button4Click(Sender: TObject);
var
     dwFlags : DWORD;
     X,Y : Integer;
begin
     dwFlags:=MOUSEEVENTF_MOVE or MOUSEEVENTF_ABSOLUTE;
     {(対象座標値を(300,200)とした場合}
     X:=Trunc(300/Screen.Width*65537);
     Y:=Trunc(200/Screen.Height*65535);

     {まず移動}
     Mouse_Event(dwFlags,X,Y,0,0);
     {クリック}
     Mouse_Event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
     Mouse_Event(MOUSEEVENTF_LEFTUP,0,0,0,0);
end;


ミミ  2004-09-08 08:16:59  No: 10830

キャー!(^-^)/
きれいにできました〜♪Mr.XRAYさん,大変ありがとうございました.
これからはヘルプ等をがんばって自分で読んで,解決できるように精進します.何かあると,人に頼ってしまう癖があり‥f(>_<)

Mr.XRAYさん,本当にどうもありがとうございました!!


Mr.XRAY  URL  2004-09-08 09:11:54  No: 10831

>キャー!(^-^)/

変な声ださないで下さい !!  (^_^);

もし,掲示板をご覧になっている方で,先程のコードを試してみたい方は
座標値として次の値を用いると,その動作がわかりやすいのではないかと
思います.

     {(対象座標値をこのFormの左上とした場合}
     X:=Trunc((Form1.Left+10)/Screen.Width*65537);
     Y:=Trunc((Form1.Top+10)/Screen.Height*65535);


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加