VB6で別のVB6プログラムのSliderを操作したい その2

タグの編集
投稿者 ひでぽん  (社会人) 投稿日時 2021/2/14 10:11:22
先日質問してご教示いただきました下記についてです。
VB6で別のVB6プログラムのSliderを操作したい
http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30588


Sliderバーを設置したFormA側でバーが進められたイベントが取得できなくて現状はFormAにCommandボタンを設置してFormBからFormAに対してSliderバーを操作、Commandクリックを行ってFormA側でバーの変化をとらえています。FormA側でバーの変化をとらえる方法がありましたらご教示ください。
投稿者 (削除されました)  () 投稿日時 2021/2/14 18:23:35
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/2/14 23:15:51
案1) DDE で値を追跡する。
※両方のアプリに手を加える必要があるので、ちょっと回りくどい。

=== FormA.exe ===
プロジェクト名 = "ProjectA"
メインフォーム … Name や Caption は任意
  LinkMode: 1 - ソース
  LinkTopic: "HideponForm"
TextBox コントロール … Visible は True でも False でも良い
  Name: SliderLinkText

Private Sub Form_Load()
    SliderLinkText.Text = CStr(Slider1.Value)
End Sub
Private Sub Slider1_Change()
    SliderLinkText.Text = CStr(Slider1.Value)
End Sub
Private Sub Slider1_Scroll()
    SliderLinkText.Text = CStr(Slider1.Value)
End Sub



=== FormB.exe ===

Private Sub Form_Load()
    Label1.LinkTopic = "ProjectA|HideponForm"
    Label1.LinkItem = "SliderLinkText"
    Check1.Caption = "自動同期"
    Command1.Caption = "手動取得"
End Sub
Private Sub Check1_Click()
    Label1.LinkMode = IIf(Check1.Value, vbLinkAutomatic, vbLinkNone)
End Sub
Private Sub Command1_Click()
    Label1.LinkMode = vbLinkManual
    Label1.LinkRequest
    Label1.LinkMode = vbLinkNone
End Sub




案2) Slider 側に手を加えられない場合には、API 使用になりますが、
TBM_GETPOS メッセージ(&H400&)を投げることで、現在の値を戻り値として取得できるかと。
https://docs.microsoft.com/ja-jp/windows/win32/controls/tbm-getpos


もしも値の変化を追跡したい場合はサブクラス化して、
http://rucio.a.la9.jp/main/tyukyu/tyukyu9.htm
受信したメッセージが  WM_NOTIFY (&H4E&) だった場合に、
https://docs.microsoft.com/en-us/windows/win32/controls/wm-notify
その時の LPARAM を NMHDR 構造体のポインタとして扱い、
https://docs.microsoft.com/en-us/windows/win32/api/richedit/ns-richedit-nmhdr
NMHDR の code メンバーが TRBN_THUMBPOSCHANGING(-1502&) を指していれば、
https://docs.microsoft.com/en-us/windows/win32/controls/trbn-thumbposchanging
LPARAM を NMTRBTHUMBPOSCHANGING 構造体のポインタとして扱って、
NMTRBTHUMBPOSCHANGING の dwPos メンバーを取り出してみてください。
https://docs.microsoft.com/en-us/windows/win32/api/commctrl/ns-commctrl-nmtrbthumbposchanging
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2021/2/14 23:36:27
案2 については試していません。
書いておいて何ですが、今回はプロセス関数なので、
TRBN_THUMBPOSCHANGING の方の処理は使えない気もします。
変更通知に拘らなければ、Timer で TBM_GETPOS をポーリングするのが関の山かも。


案3 としては、UIAutomation で Slider コントロールを拾って
変更通知イベントを捉えるとかですかね。こちらも未検証です。
投稿者 ひでぽん  (社会人) 投稿日時 2021/2/15 14:10:15
魔界の仮面弁士様
ご教示ありがとうございます。

正直、以前教えて頂きた方法でFormAのSliderを操作したらFormAでSlider1_ScrollやSlider1_Changeといったイベントが発生しないとは考えていませんでした。もう少し色々試してみます。
投稿者 (削除されました)  () 投稿日時 2021/2/15 14:52:30
(削除されました)