DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WIN32APIを使用してリストボックスの項目をクリック

環境/言語:[VB.net2008EE]
分類:[.NET]

WIN32APIを使ってlistboxの項目の選択が出来ても、
Listboxをクリックした時の動作が起きてくれません。

どのようにすればいいのかまったく検討が付きません
よろしければ教えてください。
> WIN32APIを使ってlistboxの項目の選択が出来ても、
> Listboxをクリックした時の動作が起きてくれません。

  Win32 API で、ListBoxの項目選択は、ウィンドウメッセージを
  ListBoxのウィンドウハンドルにSendMessageするだkですが、
  クリックした際の動作は、ListBoxからメッセージがWndProcに
  入ってきます。メッセージの方向が違いますネ!

  なので、動作が起きていないのではなくて、WndProcで正しく取
  得できていないと思いますが、どうやって『起きていない』と、
  言われているのでしょうか?

  クリックしたという動作を、エミュレートする動作をプログラ
  ムから行っているということですか?それでも最終的には、ク
  リックイベントとしてウィンドウメッセージがWndProcに入って
  きます。

  もしかして、その際のイベントのメッセージを自分自身に投げる
  と言うことがしたいだけですか?

以上。
説明が下手ですみません。

VB.NETよりWin32Apiのsendmessageをつかって別アプリケーションを操作したいと考えてます。

SendMessage(「別アプリのListboxのウィンドハンドル」, LB_SETCURSEL, index, 0)
と投げて選択することは可能でしたが、そのListboxを選択した際に起こるアクションが起きてくれないのです。
なにか他にも投げる必要があるのでしょうか?
また 同様にコンボボックスも同じです。
> VB.NETよりWin32Apiのsendmessageをつかって別アプリケーションを操作したいと考えてます。

別アプリケーションもVB.NETなどで作成されたアプリケーションですか?

>
> SendMessage(「別アプリのListboxのウィンドハンドル」, LB_SETCURSEL, index, 0)
> と投げて選択することは可能でしたが、そのListboxを選択した際に起こるアクションが起きてくれないのです。

別アプリでSelectionChangedイベントは起こるかもしれません(Enterイベントも起こるかもしれない)が、Clickイベントは発生しないと思います。(クリックしたわけではないので)
おそらく違います。 ただ 別アプリケーションが製作された言語は不明です。

■No31156に返信(ピーコックさんの記事)
>>VB.NETよりWin32Apiのsendmessageをつかって別アプリケーションを操作したいと考えてます。
>
> 別アプリケーションもVB.NETなどで作成されたアプリケーションですか?
>
>>
>>SendMessage(「別アプリのListboxのウィンドハンドル」, LB_SETCURSEL, index, 0)
>>と投げて選択することは可能でしたが、そのListboxを選択した際に起こるアクションが起きてくれないのです。
>
> 別アプリでSelectionChangedイベントは起こるかもしれません(Enterイベントも起こるかもしれない)が、Clickイベントは発生しないと思います。(クリックしたわけではないので)
■No31157に返信(ららさんの記事)
> 別アプリケーションが製作された言語は不明です。

バイナリからある程度の推測はできそうですが、それはともかくとして:


> そのListboxを選択した際に起こるアクションが起きてくれないのです。
選択することとクリックすることは別物ですよ。


> なにか他にも投げる必要があるのでしょうか?

SendInput API でマウスエミュレートしてみるとか。
C#同士で試してみましたが、確かにSelectedIndexChangedイベントなどが発生しませんね。
LB_SETCURSELのあと、GetParentで取ってきた親コントロールにWM_COMMANDのLBN_SELCHANGEを投げてやるとSelectedIndexChangedを強制的に起こせますが。
// .NETアプリならコントロールID使ってないから単純だけど、MFCアプリとかだとどうだろう?
LBN_SELCHANGEの投げてみましたがやっぱりだめでした。
今回はあきらめます。 アクティブウィンドウ外でやりたかったんですが
無理そうです。
また何かあれば教えてください
みなさまありがとうございました。

■No31160に返信(Hongliangさんの記事)
> C#同士で試してみましたが、確かにSelectedIndexChangedイベントなどが発生しませんね。
> LB_SETCURSELのあと、GetParentで取ってきた親コントロールにWM_COMMANDのLBN_SELCHANGEを投げてやるとSelectedIndexChangedを強制的に起こせますが。
> // .NETアプリならコントロールID使ってないから単純だけど、MFCアプリとかだとどうだろう?
解決済み!
SPY++ で、正常なメッセージの流れを見つけ、同様の動作をする
プログラムを作れば、そう問題ではないはず。

マウス操作の際のWindowメッセージの流れを、SPY++でみてみましょう!

以上。参考まで

DOBON.NET | プログラミング道 | プログラミング掲示板