|
分類:[.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
|