0

I created a form that has 2 buttons. One button pops a msgbox and the other runs form frmAPI (code is listed below) listed below. If I open the msgbox and leave it open and then run the frmAPI it will list the msgbox and its text and then close it. THis is what I expect it to do. If I open another application and generate a msgbox in that app with my frmAPI still running it will in fact list the other apps msgbox and the text but it does not close the msgbox from the other app. If Irun the frmAPI from the other app and do the same test the results are reversed. So in short it will only close the dialog from within the same app.

ダイアログであり、私の基準に一致するテキストがあることに基づいて、任意のアプリからダイアログを閉じることができるようにしたいと考えています。私が間違っていることについて何か助けはありますか?

ありがとう

Imports System.Runtime.InteropServices
Imports System.Text

Partial Public Class TestMSgBoxStuff
    Inherits Form
    Public Sub New()
        InitializeComponent()
    End Sub

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function FindWindow(lpClassName As String, lpWindowName As String) As IntPtr
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function FindWindowEx(hwndParent As IntPtr, hwndChildAfter As IntPtr, lpszClass As String, lpszWindow As String) As IntPtr
    End Function

    <DllImport("user32.dll", CharSet:=CharSet.Auto, SetLastError:=True)> _
    Private Shared Function GetWindowText(hWnd As IntPtr, lpString As StringBuilder, nMaxCount As Integer) As Integer
    End Function

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function GetWindowTextLength(hWnd As IntPtr) As Integer
    End Function

    <DllImport("user32.dll", SetLastError:=True)> _
    Private Shared Function SendMessage(hWnd As HandleRef, Msg As UInteger, wParam As IntPtr, lParam As IntPtr) As IntPtr
    End Function
    <DllImport("user32", CharSet:=Runtime.InteropServices.CharSet.Auto, SetLastError:=True, ExactSpelling:=True)>
    Private Shared Function SetForegroundWindow(ByVal hwnd As IntPtr) As IntPtr
    End Function


    Private Const WM_IME_NOTIFY As Integer = &H282
    Private Const WM_DESTROY As Integer = &H2
    Private Const WM_NCDESTROY As Integer = &H82
    Private Const WM_CLOSE As Integer = &H10
    Private Const IMN_CLOSESTATUSWINDOW As Integer = &H1
    Private Const WM_KILLFOCUS As Integer = &H8
    Private Const WM_COMMAND As Integer = &H11



    Private Sub TestMSgBoxStuff_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Dim timer As New Timer()
        Timer1.Interval = 10000
        'detect the MessageBox every seconds
        'Timer1.Tick += New EventHandler(Timer1_Tick)
        Timer1.Start()
    End Sub

    Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
        'Get the MessageBox handle
        Dim handle As IntPtr = FindWindow("#32770", Nothing)
        Me.RichTextBox1.AppendText("Handle: " + handle.ToString() + vbLf)

        'Get the Text window handle
        Dim txtHandle As IntPtr = FindWindowEx(handle, IntPtr.Zero, "Static", Nothing)
        Me.RichTextBox1.AppendText(vbTab & "text handle: " + txtHandle.ToString() + vbLf)
        Dim len As Integer = GetWindowTextLength(txtHandle)
        Dim sb As New StringBuilder()

        'Get the text
        GetWindowText(txtHandle, sb, len + 1)
        Me.RichTextBox1.AppendText(vbTab & "text: " + sb.ToString() + vbLf & vbLf)
        Me.RichTextBox1.ScrollToCaret()

        SetForegroundWindow(handle)

        'close the messagebox WM_CLOSE
        Dim lResults As Integer = SendMessage(New HandleRef(Nothing, handle), WM_NCDESTROY, IntPtr.Zero, IntPtr.Zero)

    End Sub
End Class
4

1 に答える 1

1

User Interface Privilege Isolationが発生している可能性があります。これにより、メッセージがより高い特権プロセスに送られるのをブロックできます。こちらもご覧くださいChangeWindowsMessageFilter()

WM_COMMANDの代わりにWM_CLOSE;を送信することをお勧めします。WM_COMMAND通常、システムによってより穏やかに処理され、通過する可能性があります。BN_CLICKED を WPARAM の上位ワードとして使用し、IDOK を下位ワード (OK ボタンがあると仮定) として使用し、LPARAM の OK ボタンへのハンドルを使用します。その他のボタン メッセージはここにあります。

于 2013-02-14T22:34:19.053 に答える