■94659 / inTopicNo.11) |
Re[9]: 別アプリのリストボックス上のフォーカス行をWクリックしたい |
□投稿者/ Tom (18回)-(2020/04/29(Wed) 17:32:58)
|
とっちゃん さま
>SysListView32は、「リストボックス」ではなく「リストビュー」と呼ばれるものです。 うあ。 わたくし、そもそも出発点から間違っていたのですね…
>こっちは、座標がいるんじゃなかったかなぁ? やっぱり座標が… って絶望してたら、ちょっとだけ思いました。 「あれ?座標に移動してダブルクリックするだけなら、そもそもハンドルとかも要らないんじゃ?」 で、いろんなサイトを参考にしてこんなコードをまずは書きました。 int Old_xPos; int Old_yPos; Old_xPos = System.Windows.Forms.Cursor.Position.X; Old_yPos = System.Windows.Forms.Cursor.Position.Y; SetCursorPos(New_xPos, New_yPos);//New_xPosとNew_yPosは事前に取得 //この4つをセットでダブルクリック mouse_event(WM_LBUTTONDOWN, 0, 0, 0, 0); mouse_event(WM_LBUTTONUP, 0, 0, 0, 0); mouse_event(WM_LBUTTONDOWN, 0, 0, 0, 0); mouse_event(WM_LBUTTONUP, 0, 0, 0, 0); SetCursorPos(Old_xPos, Old_yPos);//元の位置に戻す
とりあえず期待通りの動き(マウスカーソルの残骸が残っていましたが)をしましたので、 あとはどうやって対象行の座標を得るか ってことに収束しました。 しかし、それこそが Hongliang さまのおっしゃる通り難易度がかなり高そうです。
で、いろいろ調べていたら https://oshiete.goo.ne.jp/qa/4558229.html でリストビューの情報の取り方がありました。 そこで public const uint LVM_GETITEMCOUNT = (0x1000 + 4); int nItems = SendMessage(hWnd, LVM_GETITEMCOUNT, 0, 0); を行ってみたところ、リストには値があるのにもかかわらず戻り値は0でした。 どうも使い方を誤っているようです。
ここが間違っている等のアドバイスを頂けませんでしょうか?
余談 こんなことも試していました。 リストビューのフォーカス行はあらかじめ先頭行に移動してから該当行に移動します。 (同じ値の行のなかで先頭行にフォーカスしたいため) で、今回制御しようとするアプリでHOMEキーを送信してから該当行に移動するボタンクリックします。 つまり、該当行に移動する前と移動後のタイミングが取れるのです。 そこで移動前のスクリーンショットと移動後のスクリーンショットを取得し、比較することで 座標を得ようとしました。 なんとうまくいきました! が、別アプリのある個所に該当行の値が表示されており、そこを拾ってしまうのでボツとなりました… (その個所をデスクトップ画面から外に出すと動作しました。 また別問題としてデスクトップ画面の「拡大縮小とレイアウト」が100%でないとズレることもわかりました)
道は険しいです。
|
|