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

外部アプリから指定したボタンにクリックしたい

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

2つのAPLの連携を考えています。

1つ目のAPLのフォーム上に「運転」「停止」のボタンがあります。
(別の人が作成したVCのプログラムで、仕様もわからず、
外部IFもありません。)

これに対して
2つ目のAPLから、1つ目のAPLフォーム上の
「運転」「停止」のボタンをクリックしたいのですが、
どのような方法がありますか?
(2つ目のAPLは自作です。)
ボタンのウィンドウハンドルを取得して、WM_LBUTTONDOWNとWM_LBUTTONUPを送信してみてはいかがでしょうか?
■No15113に返信(管理人さんの記事)
> ボタンのウィンドウハンドルを取得して、WM_LBUTTONDOWNとWM_LBUTTONUPを送信してみてはいかがでしょうか?

まず、
FindWindowやFindWindowExなどを用いて、外部アプリのウィンドウハンドルは
取得できました。

さらに進めていくと、PostMessageで管理人さんのように
Call PostMessage(???, WM_LBUTTONDOWN, 0, 0)
Call PostMessage(???, WM_LBUTTONUP, 0, 0)
すればよいこともわかりました。

しかし、ボタンのハンドルはどのように取得するのでしょうか?
なお、対象としている外部アプリのボタンにはキャプションではなく、
イメージが貼り付けられています。
■No15161に返信(あおちゃんさんの記事)
> ■No15113に返信(管理人さんの記事)
>>ボタンのウィンドウハンドルを取得して、WM_LBUTTONDOWNとWM_LBUTTONUPを送信してみてはいかがでしょうか?
>
> まず、
> FindWindowやFindWindowExなどを用いて、外部アプリのウィンドウハンドルは
> 取得できました。

> しかし、ボタンのハンドルはどのように取得するのでしょうか?
> なお、対象としている外部アプリのボタンにはキャプションではなく、
> イメージが貼り付けられています。

VBや.NET上でのAPIの扱い方はまだわかっていないのですが、
親のウィンドウハンドルが取得できたのでしたらEnumChildWindowsあたりが
使えないでしょうか?(すみません。未検証です。)
子ウィンドウのIDさえわかっていればGetDlgItemで一発なのですが・・・。
本来であれば

ボタンを押した時の機能を呼び出せるようにつくり
AP1では「ボタンを押した時に」その機能を呼び出し
AP2では「ボタンを押すのではなく」その機能を呼び出す

というように作るべきではないでしょうか?
■No15180に返信(SadManさんの記事)
> 本来であれば
>
> ボタンを押した時の機能を呼び出せるようにつくり
> AP1では「ボタンを押した時に」その機能を呼び出し
> AP2では「ボタンを押すのではなく」その機能を呼び出す
>
> というように作るべきではないでしょうか?

■No15104(あおちゃんさんの記事)
> > >(別の人が作成したVCのプログラムで、仕様もわからず、
> > > 外部IFもありません。)
■No15173に返信(らくっぺ@FSPさんの記事)
> ■No15161に返信(あおちゃんさんの記事)
>>■No15113に返信(管理人さんの記事)
> >>ボタンのウィンドウハンドルを取得して、WM_LBUTTONDOWNとWM_LBUTTONUPを送信してみてはいかがでしょうか?
>>
>>まず、
>>FindWindowやFindWindowExなどを用いて、外部アプリのウィンドウハンドルは
>>取得できました。
>
>>しかし、ボタンのハンドルはどのように取得するのでしょうか?
>>なお、対象としている外部アプリのボタンにはキャプションではなく、
>>イメージが貼り付けられています。
>
> VBや.NET上でのAPIの扱い方はまだわかっていないのですが、
> 親のウィンドウハンドルが取得できたのでしたらEnumChildWindowsあたりが
> 使えないでしょうか?(すみません。未検証です。)
> 子ウィンドウのIDさえわかっていればGetDlgItemで一発なのですが・・・。
>

VB6ですと以下のようになるみたいですが、
VB.netにアップグレード変換してもAddress Ofなどがうまくできず、
苦戦しております。
EnumChildWindowsを呼び出すにはどのようにしたらよいでしょうか?


Public Declare Function EnumChildWindows Lib "USER32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Public Declare Function GetWindowText Lib "USER32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long

Public Function EnumChildProc(ByVal hWnd As Long) As Long

 Dim Ret As Long
 Dim Leng As Long
 Dim Name As String

   'バッファ確保
   Name = String(255, Chr(0))
   Leng = Len(Name)

   '名前を取得する
   Ret = GetWindowText(hWnd, Name, Leng)

   If Ret <> 0 Then Form1.List1.AddItem Name

   EnumChildProc = 1

End Function

Private Sub Command1_Click()
  Dim RetAs Long
  Ret = EnumChildWindows(hWnd, AddressOf EnumChildProc, 0)
End Sub
■No15184に返信(はいこーんさんの記事)
> ■No15104(あおちゃんさんの記事)
>>> >(別の人が作成したVCのプログラムで、仕様もわからず、
>>>>外部IFもありません。)

あら、ほんとうだ
しつれいをば
pinvoke.netで調べてみると、解決できるかもしれません。

pinvoke.net: EnumChildWindows (user32)
http://www.pinvoke.net/default.aspx/user32.EnumChildWindows
■No15187に返信(あおちゃんさんの記事)
> ■No15173に返信(らくっぺ@FSPさんの記事)
>>■No15161に返信(あおちゃんさんの記事)
> >>■No15113に返信(管理人さんの記事)

> VB6ですと以下のようになるみたいですが、
> VB.netにアップグレード変換してもAddress Ofなどがうまくできず、
> 苦戦しております。
> EnumChildWindowsを呼び出すにはどのようにしたらよいでしょうか?>
>
> Public Declare Function EnumChildWindows Lib "USER32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

> Public Function EnumChildProc(ByVal hWnd As Long) As Long

(処理したい内容)

> End Function
>
> Private Sub Command1_Click()
>   Dim RetAs Long
>   Ret = EnumChildWindows(hWnd, AddressOf EnumChildProc, 0)
> End Sub

(コードを一部略させていただきました)


EnumChildWindowsでは2番目のパラメータとしてコールバック関数のアドレスを
与える事になっているのでヘルプを見る限りはこの様な考え方で良さそうに
見えます。

自分は普段VC++を使っており、APIに関してはある程度は調べがつくのですが、
VBは使っていないのでこれ以上はわかりません。どうもすみません。
ただ下に示した行に関してのみは気になります。(Returnにあたるのでしょうか?)

>    EnumChildProc = 1

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