VB2008 Enumwindos実行時のハングを防ぐには?


tfk  2008-08-16 07:45:36  No: 145105

はじめて投稿します。

自作のアプリを作成しており、
以下のコードで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


tfk  2008-08-16 08:56:38  No: 145106

追記:

すいません。環境はVB2008 Express Edition/Windows Vista です。
ハングが多いのは自作アプリの起動直後の初回動作時で、
また、一度Listboxに取得後、連続して取得をするときにはかなり
反応が良く、ボタンを連続でクリックするとほぼタイムラグが無く
Listboxにスムーズに取得したテキストが追加されています。


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

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






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