ダイアログのアクティブボタンにマウス移動の自動化

解決


新米  2007-09-28 20:41:22  No: 27885

ダイアログ(例えばMessageDlg)を開くと「はい」「いいえ」のようなボタンが表示され「はい」のボタンが点線も表示されています。
ダイアログが開いたときマウスポインタを自動的に「はい」に移動する方法をありましたら教えてください。
PCのマウス設定は「ポインタを自動的に規定のボタンに移動」に設定しているのですが、いろいろな他のソフトでも自動的に移動する物としない物があります。マウスドライバの性能でしょうか。
お願いします。


かくにんだけ  2007-09-29 01:54:52  No: 27886

自前のアプリで開いたダイアログのことなのか、
それとも、他のアプリが出すダイアログすべてのことなのか...


新米  2007-09-29 02:40:56  No: 27887

かくにんだけさん、レスありがとうございます。
自前のアプリです。舌足らずで申し訳ないです。


Null  2007-09-29 03:30:11  No: 27888

こんなことかな?。
http://www.asahi-net.or.jp/~HA3T-NKMR/tips011.htm


Null  2007-09-29 03:34:13  No: 27889

ご免なさい。
意味を取り違えて居ました。
前項を削除(取り消し)致します。


moru  2007-09-29 17:09:55  No: 27890

もう少し、緻密に各コントロールのWidthなどから数値を求めた方が良いと思いますが、概略こういった方向でどうでしょうか?
すみませんが実際に動かしていないので、誤りがあったら訂正お願いします。

procedure TForm.OnCreate(Sender: TObject);
var
  dwFlags : DWORD;
  X,Y     : Integer;
  TempPos   : TPoint;
begin
  dwFlags:=MOUSEEVENTF_MOVE or MOUSEEVENTF_ABSOLUTE;

  //ボタンの位置を計算
  X:=Trunc((Left + Button1.Left + 15)/Screen.Width*65537);
  Y:=Trunc((Top + Button1.Top + 25)/Screen.Height*65535);

  //マウスカーソル移動
  Mouse_Event(dwFlags,X,Y,0,0);
end;


moru  2007-09-29 17:36:50  No: 27891

補足ですが、デュアルモニタを考慮していないのでその辺りも制御して下さい。


新米  2007-09-29 20:07:45  No: 27892

Nullさん、moruさんレスありがとうございます。
moruさんの回答でダイアログのボタンの位置が取得できませんでした。
ダイアログ(例えばMessageDlg)が開くと「はい」「いいえ」のボタンがありますが、このダイアログの「はい」ボタンの座標を取得出来ません。
Button1をフォームに貼り付けた場合は取得できますが、
ダイアログのボタンの場合は判りませんでした。
すみません。


涼しくなると…  2007-09-29 20:10:47  No: 27893

真琴:「ダイアログの出し方って、イロイロあるんでしょ? ハルコさん」
春子:「そう…あるよイロイロ…、これは CreateMessageDialog を使った例だけど」

procedure WmAPP(var msg: TMessage); Message WM_APP;
.....

procedure TForm1.Button1Click(Sender: TObject);
begin
  with CreateMessageDialog('「はい」押してね', mtInformation, [mbYes, mbNo]) do try
   ActiveControl := TWinControl(FindComponent('Yes'));
   PostMessage(Self.Handle, WM_APP, 0, ActiveControl.Handle);
   if ShowModal = mrYes then begin
    Beep;
//  ShowMessage('Yesボタンが押されたヨ');
   end;
  finally
   Free;
  end;
end;

procedure TForm1.WmAPP(var msg: TMessage);
var
  R: TRect;
begin
  GetWindowRect(msg.LParam, R);
  SetCursorPos(R.Left+30, R.Top+10);
end;

真琴:「アタシ、CreateMessageDialogって知らなかった、MessageDlgじゃダメ?」
春子:「ダメってコトはないよ、"はい"ボタンのハンドルが分かればいいんだから」
真琴:「このWM_APPっていうメッセージ、マウスカーソル動かすコトにも使えるんだぁ」
春子:「そうヨ、何にでも使える便利メッセージなの」
真琴:「この PostMessageは、SendMessageじゃいけないんだよね?」
春子:「ううん、この場合は、そっち使ってもいいヨ」
真琴:「えぇ、いいの?…だって、SendMessageだと、ShowModalの前に届いちゃうよ」
春子:「そうだけど、でもダイジョウブなんだ」
真琴:「だって、まだダイアログが無いのに、メッセージ届くなんて変じゃない」
春子:「ダイアログはあるの、場所も決まってる、Create済みだからョ。ただ見えてないだけ」
真琴:「そうなの? なんかピンとこないけど…」
春子:「ねぇ、マコト」
真琴:「ん?、なに?」
春子:「マコトがメッセージ入れたビンを海に投げた時、届けたい島はもう存在してるよネ」
真琴:「えっ?それはあたりまえじゃ…」
春子:「でも、ここからは見えない、でしょ?」
真琴:「うん、見えない…」
春子:「それと似たようなモンよ、マコト、分かった?」
真琴:「…ぅん、分かったような気がする…あるのね…」
春子:「そうだよ、見えなくてもあるの、…マコト、今日は涼しいね、昨日はあんなに暑かったのに」
真琴:「ねぇ、ハルコさん」
春子:「ん?、なに?」
真琴:「従業員部屋に幽霊がいるって知ってる?」
春子:「えっ?ホント? そんな話、聞いたことないよ」
真琴:「ハルコさん、今日みたいに急に涼しくなると、その幽霊出るんだって」
春子:「マコトぉ、ウソでしょ? 幽霊なんているわけない…」
真琴:「確かにいるの、ただ、いつもは見えないだけ…だけどぉ、ホラ、いまハルコさんの後ろに…」
春子:「きゃー!!」
真琴:「ハルコさん、アタシもネ、おじいちゃんにこうやって、おどかされたの^^」
春子:「マコト、もぉう〜」


新米  2007-09-29 20:24:32  No: 27894

涼しくなるとさんありがとうございました。
おかげさまで解決しました。
ありがとうございました。


moru  2007-09-29 21:17:12  No: 27895

>ダイアログ(例えばMessageDlg)を開くと

失礼しました。上記のように記載されていましたね。
自作のダイアログ上のボタンと勘違いしていました。


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

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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