VB6とVB2005でのFindWindowの動作が違う

解決


rabi  2006-06-21 05:06:54  No: 95808

FindWindowについて教えて下さい。
VB6では、対象のハンドルが見つからなかった時にNULL(0)が返るのですが、
VB2005では、わけのわからないくらい大きな数値が返却されてしまいます。
VB2005、VB6でAPIの宣言って、差分があるのでしょうか?

まだ、VB2005始めたばかりで、あまり良く解っていない為、ご教示の程宜しくお願い致します。

下記にソースを記述します。

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

--------

Const WINDOW_NAME As String = "アンインストールの確認"
Const BUTTON_NAME As String = "はい(&Y)"

Dim hWnd As Long                            '親ハンドル
Dim hChild As Long                          '子ハンドル

hWnd = FindWindow(vbNullString, WINDOW_NAME)                    'Windowハンドルの取得
If hWnd = 0 Then                                                'ハンドルを取得できなかった場合は、終了
    Exit Sub
End If
hChild = FindWindowEx(hWnd, 0, vbNullString, BUTTON_NAME)       'ボタンのWindowハンドルを取得する
If hChild = 0 Then                                              'ハンドルを取得できなかった場合は、終了
    Exit Sub
End If


rabi  2006-06-21 05:12:46  No: 95809

すみません・・・。
(訂正)
FindWindowについて教えて下さい。
VB6では、対象のウィンドウが見つからなかった時にNULL(0)が返るのですが、
VB2005では、わけのわからないくらい大きな数値が返却されてしまいます。
この為、対象のウィンドウが表示されていない場合の判定が出来ません。

VB2005、VB6でAPIの宣言って、差分があるのでしょうか?

まだ、VB2005始めたばかりで、あまり良く解っていない為、ご教示の程宜しくお願い致します。

下記にソースを記述します。

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

--------

Const WINDOW_NAME As String = "アンインストールの確認"
Const BUTTON_NAME As String = "はい(&Y)"

Dim hWnd As Long                            '親ハンドル
Dim hChild As Long                          '子ハンドル

hWnd = FindWindow(vbNullString, WINDOW_NAME)                    'Windowハンドルの取得
If hWnd = 0 Then                                                'ハンドルを取得できなかった場合は、終了
    Exit Sub
End If
hChild = FindWindowEx(hWnd, 0, vbNullString, BUTTON_NAME)       'ボタンのWindowハンドルを取得する
If hChild = 0 Then                                              'ハンドルを取得できなかった場合は、終了
    Exit Sub
End If


Hongliang  URL  2006-06-21 05:23:54  No: 95810

「あり得ないぐらい大きな」がヒントですねー。

VB7.0(VB.NET2002)から、整数型のビット数が変更されました。
Integer と Long がそれぞれ 32bit、64bit を指す型になります。
ですので、FindWindow の返値を Long で取ってしまうと、隣の無関係の4バイトも含めて判断されてしまうわけです。

それはそれとして、VB7.0 以降では、ハンドルには数値型ではなく IntPtr 型を使用するようにしましょう。
これなら 64bitOS 対応も勝手にやってくれます(IntPtr は 32bitOS では 4 バイト、64bitOS では 8 バイトとして扱われます)。


rabi  2006-06-21 22:26:12  No: 95811

Hongliangさん
有難うございます。

FindWindowで見付からない時、正常にNULLが返却されました。

載せたソースに問題があるようで、対象のWindowが有るのにNULLが返ってきてしまいます。そちらは、自分で何とかしてみます。
(と、いうことなので上記ソースは、バグがあります。参考になりませんから使わないでくださいね。)
( ;^^)ヘ..


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

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






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