続:別プログラムのコンボボックスを選択するには

解決


ハッピーハッピー  2006-05-06 08:25:38  No: 95280

先ほど、コンボボックスの選択でうまく行ったと書きましたが、結局、チェンジイベントが発生せず見かけ上、選択されたようになっていました。

Declare Function SendMessage Lib "user32" _
  Alias "SendMessageA" (ByVal hwnd As Integer,_
                        ByVal wMsg As Integer, _
                        ByVal wParam As Integer, _
                        ByVal lParam As String) As Integer
Const CB_SELECTSTRING = &H14D

SendMessage(hWnd, CB_SELECTSTRING, -1, "Printer A")

このような方法で、チェンジイベントまで発生させることが可能でしょうか?


ガッ  2006-05-06 08:37:09  No: 95281

んーと、CB_FINDSTRINGEXACTで検索して、それを選択するとか?
…もしかしたら.NET Frameworkにそんなメソッドがあるかもしれませんが。


ハッピーハッピー  2006-05-06 09:12:02  No: 95282

ご回答ありがとうございます
このようにやってみました

dim idx As Integer

idx = SendMessage(cmbTest.Handle, CB_FINDSTRINGEXACT, -1, "Printer A")
If idx >= 0 Then
   SendMessage(cmbTest.Handle, CB_SETCURSEL, idx, 0)
End If

やっぱし、チェンジイベントが発生しません
CB_FINDSTRINGEXACTでちゃんとインデックスが取得できて、CB_SETCURSELで表示上はうまく選択できています


ハッピーハッピー  2006-05-06 09:22:42  No: 95283

すみません、このスレッドから見られて方に環境の説明がありませんでした
VB2005です


ガッ  2006-05-06 09:35:51  No: 95284

やっぱりFindStringExactメソッドがありますね:
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.combobox_members(VS.80).aspx

検索するインタフェイスが用意されているのならば、
検索結果を選択するインタフェイスも用意されているのではないでしょうか?:
http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.combobox.selectedindex.aspx
(かも)


Hongliang  URL  2006-05-06 10:20:40  No: 95285

CB_SETCURSEL なり CB_SELECTSTRING なりで変更したあと、WM_COMMAND(&H111) で CBN_SELCHANGE を[親]ウィンドウに送信してあげてください。


ハッピーハッピー  2006-05-08 06:04:08  No: 95286

返事が遅れまして申し訳ありません。

ガッさん、ご回答感謝いたします。
いろいろとやってみたのですが、この方法だとComboboxのインスタンスが必要で他プログラムのウィンドウズハンドルからインスタンスへの変換が分からず行き詰まりました。


Hongliangさん、ありがとうございます。
こちらも、いろいろと試して見たのですがうまくいきません。
Const WM_COMMAND = &H111
Const CBN_SELCHANGE = &H1
SendMessage(OyaHandle, WM_COMMAND, CBN_SELCHANGE, comboHandle)
このようにしてみたのですが・・・・


Hongliang  URL  2006-05-08 09:19:19  No: 95287

WM_COMMAND はちょっと変な形式でして。
WPARAM に指定する通知コードは、上位 16 ビットで指定します。
下位 16 ビットはコントロールの ID ですが、これは 0 で問題ないようです。
幸い、VB には VB7.1(VB.NET 2003) からビットシフト演算子が追加されたので、これで CBN_SELCHANGE の値を左に 16 ビットシフトしてやれば良いでしょう。


ハッピーハッピー  2006-05-08 10:33:10  No: 95288

Hongliangさん、ありがとうございます。
無事解決できました。
CBN_SELCHANGEの値を16ビット左にシフトした結果の&H10000を指定することでできました
そして、SendMessageではなくPostMessageにしたらOKでした。

Public Declare Function SendMessage Lib "user32" _
      Alias "SendMessageA" (ByVal hwnd As Integer, _
                            ByVal wMsg As Integer, _
                            ByVal wParam As Integer, _
                            ByVal lParam As String) As Integer

Public Declare Function PostMessage Lib "user32" _
      Alias "PostMessageA" (ByVal hwnd As Integer, _
                            ByVal wMsg As Integer, _
                            ByVal wParam As Integer, _
                            ByVal lParam As Integer) As Integer

Const CB_SELECTSTRING = &H14D
Const WM_COMMAND = &H111
Const CBN_SELCHANGE = &H10000
SendMessage(ComboHandle, CB_SELECTSTRING, -1, "Printer A")
PostMessage(OyaHandle, WM_COMMAND, CBN_SELCHANGE, ComboHandle)


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

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







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