はじめて投稿します。
自作のアプリを作成しており、
以下のコードでEnumwindowsを実行してListboxに
ウインドウのテキストを取得しています。
ただ、一覧の取得は成功するのですが、時々アプリ
自体が「応答なし」となってハングしてしまいます。
コードのどこかに欠陥があるのではと思うのですが、わかりません。
Excel VBA(VB6?)で作成したデリゲートを使用しない方法のほうが
驚くほど取得のスピードも速く、ハングすることもありません。
コード自体が滅茶苦茶なのでしょうか?
Option Explicit On
Imports System.Runtime.InteropServices
Imports System.Text
Public Class Form3
Private Declare Function SendMessage Lib "user32.dll" _ Alias "SendMessageA" _
(ByVal hWnd As Integer, _
ByVal wMsg As Integer, _
ByVal wParam As Integer, _
ByVal lParam As String) As Integer
Private Declare Function EnumWindows Lib "user32.dll" _
(ByVal lpEnumFunc As Smpl, _
ByVal lParam As Integer) As Integer
Const WM_GETTEXT = &HD
Const WM_GETTEXTLENGTH = &HE
Private Delegate Function Smpl(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.ListBox1.BeginUpdate()
Dim Sample As New Smpl(AddressOf Ewproc)
Dim Ret As Integer
Ret = EnumWindows(Sample, 0)
Me.ListBox1.EndUpdate()
Private Function Ewproc _
(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer
Dim smsg As Integer
Dim stnm As String
Dim stlg As Integer
stlg = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)
stnm = Space(stlg + 1)
smsg = SendMessage(hwnd, WM_GETTEXT, stlg + 1, stnm)
stnm = Mid(Trim(stnm), 1, Len(Trim(stnm)))
If smsg <> 0 Then
Me.ListBox1.Items.Add(stnm)
End If
Ewproc = 1
End Function
End Class
追記:
すいません。環境はVB2008 Express Edition/Windows Vista です。
ハングが多いのは自作アプリの起動直後の初回動作時で、
また、一度Listboxに取得後、連続して取得をするときにはかなり
反応が良く、ボタンを連続でクリックするとほぼタイムラグが無く
Listboxにスムーズに取得したテキストが追加されています。
ツイート | ![]() |