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

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

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

Re[4]: ハンドル取得時、指定したウィンドウタイトルが変化する。


(過去ログ 98 を表示中)

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

■58450 / inTopicNo.1)  ハンドル取得時、指定したウィンドウタイトルが変化する。
  
□投稿者/ Oyaji (1回)-(2011/04/05(Tue) 19:28:50)

分類:[.NET 全般] 

いつもお世話になっております。
不可解な現象が発見されましたので、その理由などご存知の方のご教授をお願いします。

現象
以下のソースコードで HWnd = FindWindow(vbNullString, strWindowText) を実行する前後で、strWindowTextの値が
"電卓"から"電",更に""に変化してしまう。

説明
目的はウィンドウタイトルからそのウィンドウのハンドルを取得するものです。
独立したエクゼファイルが必要になったのでVBAからVBにコピーしました。元ネタはどこかのサイトから頂いてきた
ものに少々の変更を加えてVBAでの動作はOKでした。
本ソフトを走らせる前に電卓を起こしておけば問題は有りません。しかし本ソフトの後で電卓を起こした場合
正しいハンドルの取得が出来ません。ステップ動作で上記現象を発見しました。
尚確認の為あちこちにConsole・・・を入れてありますが本質ではありません。
電卓が立ち上がっている場合、最初の1回目の動作でハンドルが取得でき、値は正しいことを確認しました。
立ち上がっていない場合、1回目のループで"電"、2回目のループで""と変化します。従って対策としてLoopの中で
毎回定義しなおしています。
納得が行かないのでエクゼファイルでの確認は未実施です。

質問
なぜstrWindowTextの値が"電卓","電",""と変化するのでしょうか?
コードのどこが問題でしょうか?
或いはVB特有の現象でしょうか?


環境
WindowsXP SP3  Visual Basic 2010 Express

以上宜しくお願いします。

Module Module1

    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)     
    
  Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

    Sub Main()
        Dim strWindowText As String
        Dim HWnd As Integer

        strWindowText = "電卓"
        Console.WriteLine(strWindowText & "を調査中" & vbCrLf)

        Do While HWnd = 0

            'strWindowText = "電卓"       '対策

            HWnd = FindWindow(vbNullString, strWindowText)
            If HWnd <> 0 Then
                Console.WriteLine(strWindowText)
                Console.WriteLine("ウィンドウハンドルは、" & Hex(HWnd))
                Console.Read()
                Exit Do
            End If

            System.Threading.Thread.Sleep(500)

        Loop

    End Sub

End Module

引用返信 編集キー/
■58451 / inTopicNo.2)  Re[1]: ハンドル取得時、指定したウィンドウタイトルが変化する。
□投稿者/ アーモン (1回)-(2011/04/05(Tue) 20:49:11)
2011/04/05(Tue) 20:55:08 編集(投稿者)

No58450 (Oyaji さん) に返信

FindWindowの第2引数はNULLで終わる文字列である必要がありますので、

HWnd = FindWindow(vbNullString, strWindowText & vbNullString)

とすべきではないでしょうか。
おそらくNULL文字がないとおかしくなってしまうと思います。

そうでなければ、第2引数には定数を設定するか、第2引数の型をSystem.Text.StringBuilderにすると
いいのではないでしょうか。
引用返信 編集キー/
■58453 / inTopicNo.3)  Re[2]: ハンドル取得時、指定したウィンドウタイトルが変化する。
□投稿者/ 渋木宏明 (71回)-(2011/04/05(Tue) 22:08:35)
渋木宏明 さんの Web サイト
>Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
>(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer

MBCS 版の API 呼ぼーとしてるみたいですが、↑の宣言で String は正しく MBCS に変換されるんでしたっけ?

> HWnd = FindWindow(vbNullString, strWindowText & vbNullString)

vbNullString って NULL に変換されるんでしたっけ?
引用返信 編集キー/
■58454 / inTopicNo.4)  Re[3]: ハンドル取得時、指定したウィンドウタイトルが変化する。
□投稿者/ アーモン (2回)-(2011/04/05(Tue) 22:22:56)
>>HWnd = FindWindow(vbNullString, strWindowText & vbNullString)
>
> vbNullString って NULL に変換されるんでしたっけ?

失礼、

HWnd = FindWindow(vbNullString, strWindowText & vbNullChar)

の間違いです。
(ただし、文字結合することによりvbNullStringは、結果的にvbNullCharが割り当てられます。)
引用返信 編集キー/
■58456 / inTopicNo.5)  Re[4]: ハンドル取得時、指定したウィンドウタイトルが変化する。
□投稿者/ Oyaji (2回)-(2011/04/05(Tue) 23:24:14)
No58454 (アーモン さん) に返信

アーモンさん、渋木宏明さん返信ありがとうございます。

正解でした。 解決!

これで安心してエクゼファイルを作れます。
素人ゆえ丸1日悩んでいました。
今後とも宜しくお願いします。

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


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

このトピックに書きこむ

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

管理者用

- Child Tree -