| ■No94630 (Tom さん) に返信 > とっちゃん さま > > アドバイス、ありがとうございます。 > >LVN_DBLCLK かな?制御したいアプリが WinForms か Win32 Nativeならこれで行けると思います。 >> >>https://docs.microsoft.com/en-us/windows/win32/controls/lbn-dblclk >> >>でも System.Windows.Forms.ListBox にはイベントないな。。。 > 情けないことにちょっとまだ上記内容がわかっていないのですが、 > よくよく考えたら ダブルクリックのSendMessageをあるハンドルに対して行う って > 単純なことで良いのでしょうか? > あるハンドル というのが自アプリ内のものではなく、別アプリのものであっても問題ないと。 > > もしそれであったらと思い、いろいろ調べたのですが、そもそも「ダブルクリックのSendMessage」を > どうやって作ればよいのかがわかりません。 > > 上記内容、わたくしが勘違いしていたらそのご指摘と、 > 実現するために更なるアドバイスを頂けませんでしょうか? > LVN_DBLCLK というメッセージは、ListBox コントロールがダブルクリックされたということを 親ウィンドウ(コントロールのオーナー)に対して通知するメッセージになります。
「マウスのダブルクリックをリストボックスに送る」のではなく、 『「リストボックスがマウスのダブルクリックを受け取った」という通知を「親ウィンドウ」に送る』
という処理をします。 操作をエミュレートするのではなく、そういう操作が発生したという結果だけを送ってやるという形です。
ちなみに、これができるのは、先にも書いていますが、Windows.Formsアプリまたは Win32 Native なアプリだけです。
アプリがどういうものかわからない場合は、Spy++ などで、ウィンドウをたどってみるのが一番わかりやすいです。
一応。。。送って処理されることが期待できるアプリであれば、
SendMessage( 親ウィンドウのハンドル, LVN_DBLCLK, MAKEWPARAM( xPos, yPos ), 0 );
という形で送信できます。
MAKEWPARAM は OS提供のマクロですが、C/C++ 向けなので C#の場合は、 IntPtr MAKEWPARAM( int low, int hight ){ return (low | (high)<<16); } という形で定義します。
SendMessage は世に多数転がっていますが、DLLからエクスポートされてる形をストレートに書くと下記のようになります。
[DllImport("user32.dll", CharSet=CharSet.Unicode, SetLastError=true, CallingConvention=CallingConvention.Winapi)] static LONG SendMessageW( IntPtr hwnd, Uint32 msg, IntPtr wParam, IntPtr lParam );
[DllImport("user32.dll", CharSet=CharSet.Ansi, SetLastError=true, CallingConvention=CallingConvention.Winapi)] static LONG SendMessageA( IntPtr hwnd, Uint32 msg, IntPtr wParam, IntPtr lParam );
どっちを使っても送信できますが、プロセスをまたぐので、W のほうがよいと思います。
ウィンドウハンドルの取得については、どうやってリストボックスを判定しているかがわからないので省略。
|