C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: VB6作成ソフトをVB.NETから操作したい


(過去ログ 136 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■80008 / inTopicNo.1)  VB6作成ソフトをVB.NETから操作したい
  
□投稿者/ shu11 (1回)-(2016/06/03(Fri) 15:36:52)

分類:[VB6 以前] 

初めて投稿します。
VB2013Proにて、ソフト作成中です。

VB6で作成したソフトがあり、そのソフトのボタンをクリックし、動作実行させたいの
ですが、うまくいきません。
FindWindow、FindwindowExにてウインドウ、ボタンのハンドルを取得し、SendMessageにて、
ボタンを押させるだけのものですが、応答しない状態です。
別のVB.NETで作成したソフトに同様の操作をすると、動作するので、
メッセージの受け渡し方が違っていると思われます。

コードとしては、

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" _
(ByVal hwndParent As Integer, ByVal hwndChildAfter As Integer, _
ByVal lpszClass As String, ByVal lpszWindow As String) As Integer
Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" _
(ByVal hWnd As Integer, ByVal MSG As Integer, ByVal wParam As Integer,_
ByVal lParam As Integer) As Integer

Public hwnd1, hwnd2 As Integer ' Window Handle


Public Sub BtnClkA()

' ウインドウハンドル取得
hwnd1 = FindWindow("FormDC", "Firmware Write Program ")

' ボタンのハンドル取得
hwnd2 = FindWindowEx(hwnd1, 0, "CommandButton", "Normal Write")

SendMessage(hwnd2, BM_CLICK, 0, 0) ' Button Click

End Sub

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

"Firmware Write Program"という名前のソフトの、"Normal Write"というボタンを
押したいだけです。

VB6側は、ソースコードが無く、実行ファイルだけの状態です。
※古くて、資料が残っていない状態

どなたか、御教示いだだけないでしょうか?

よろしくお願い致します。






引用返信 編集キー/
■80010 / inTopicNo.2)  Re[1]: VB6作成ソフトをVB.NETから操作したい
□投稿者/ shu (877回)-(2016/06/03(Fri) 17:26:08)
No80008 (shu11 さん) に返信

とりあえず
hwnd1 ,hwnd2 が正確に取得出来ているか確認してみてはどうでしょう?
引用返信 編集キー/
■80013 / inTopicNo.3)  Re[1]: VB6作成ソフトをVB.NETから操作したい
□投稿者/ 魔界の仮面弁士 (743回)-(2016/06/03(Fri) 17:31:06)
No80008 (shu11 さん) に返信
> Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
> (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

ハンドルは IntPtr 型にしておきましょう。
もしも Integer で宣言するなら、アプリを x86 ビルドにする必要があります。


それと、Win9x 系が淘汰された現在では、ANSI 版である必要は無いので、
Unicode 版の API で実装しておいた方が良いかと思います。
(とはいえ、世の中のサンプルの多くが A 系のままだったりはしますが)


> FindWindow、FindwindowExにてウインドウ、ボタンのハンドルを取得し、SendMessageにて、
> ボタンを押させるだけのものですが、応答しない状態です。

得られたウィンドウハンドルが正しい事は確認済みでしょうか?



> hwnd1 = FindWindow("FormDC", "Firmware Write Program ")

第二引数の末尾に空白が含まれているのはワザとでしょうか。

また、第一引数を "FormDC" にしているのは何故でしょうか。

相手が VB6 製であるのなら、第一引数は
"ThunderRT6FormDC" (EXE の場合) または
"ThunderFormDC" (開発環境の場合) だと思いますが…。


> hwnd2 = FindWindowEx(hwnd1, 0, "CommandButton", "Normal Write")
こちらも同様で、"ThunderRT6CommandButton"
あるいは "ThunderCommandButton" というクラス名のはず。


> SendMessage(hwnd2, BM_CLICK, 0, 0) ' Button Click

「Const BM_CLICK As Integer = &HF5」は宣言済みですか?
引用返信 編集キー/
■80017 / inTopicNo.4)  Re[2]: VB6作成ソフトをVB.NETから操作したい
□投稿者/ shu11 (3回)-(2016/06/03(Fri) 18:26:34)
No80010 (shu さん) に返信
> ■No80008 (shu11 さん) に返信
>
> とりあえず
> hwnd1 ,hwnd2 が正確に取得出来ているか確認してみてはどうでしょう?

有難うございます。
SPY++にて、ハンドルがあっているのを確認済みです。
引用返信 編集キー/
■80018 / inTopicNo.5)  Re[2]: VB6作成ソフトをVB.NETから操作したい
□投稿者/ shu11 (4回)-(2016/06/03(Fri) 18:38:58)
No80013 (魔界の仮面弁士 さん) に返信
回答有難うございます。

> ■No80008 (shu11 さん) に返信
>>Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
>> (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
>
> ハンドルは IntPtr 型にしておきましょう。
> もしも Integer で宣言するなら、アプリを x86 ビルドにする必要があります。
x86ビルドで気が付きました。
当方、64bit環境で実験していました。
先ほど、Win7 32bitで試したところ、応答するようになりました。
VB6は、32bitのみということですね。
IntPtrに修正しました。

>
> それと、Win9x 系が淘汰された現在では、ANSI 版である必要は無いので、
> Unicode 版の API で実装しておいた方が良いかと思います。
> (とはいえ、世の中のサンプルの多くが A 系のままだったりはしますが)
あまり詳しく無いのですが、ネットで探したサンプルを使っていましたので、A系になっています。
Unicode 版の方がいいということですね。


>
>>FindWindow、FindwindowExにてウインドウ、ボタンのハンドルを取得し、SendMessageにて、
>>ボタンを押させるだけのものですが、応答しない状態です。
>
> 得られたウィンドウハンドルが正しい事は確認済みでしょうか?
SPY++で確認しています(64bit版でしたが)。


>
>
>> hwnd1 = FindWindow("FormDC", "Firmware Write Program ")
>
> 第二引数の末尾に空白が含まれているのはワザとでしょうか。
SPYで調べたところ、空白が入っていました。


>
> また、第一引数を "FormDC" にしているのは何故でしょうか。
>
> 相手が VB6 製であるのなら、第一引数は
> "ThunderRT6FormDC" (EXE の場合) または
> "ThunderFormDC" (開発環境の場合) だと思いますが…。
仰るとおりで、今回、投稿するときに省略していました。
"ThunderRT6FormDC"が正解です。

>
>> hwnd2 = FindWindowEx(hwnd1, 0, "CommandButton", "Normal Write")
> こちらも同様で、"ThunderRT6CommandButton"
> あるいは "ThunderCommandButton" というクラス名のはず。
こちらも、"ThunderCommandButton"です。


>
>> SendMessage(hwnd2, BM_CLICK, 0, 0) ' Button Click
>
> 「Const BM_CLICK As Integer = &HF5」は宣言済みですか?
宣言済みです。

とりあえず、32bit版で動かすことは出来ますので、解決です。
明快なアドバイスいただき、ありがとうございました。
助かりました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -