VB:ShowWindow焦点问题

时间:2015-02-27 16:42:03

标签: vb.net showwindow

我试图将自动击键发送到不支持通过小型VB表单进行复制+粘贴的应用程序。表单从文本文件加载数据,并在单击按钮后使用SendKeys将其触发。

除ShowWindow部分外,一切似乎都有效。我目前正在使用记事本进行测试,除了一个例外,我似乎无法让ShowWindow专注于记事本。显然我担心它会对我最终会反对的应用程序做同样的事情(我目前无法访问它)。使记事本处于活动状态的唯一ShowWindow参数是SW_SHOWMAXIMIZED。如果最小化,SW_SHOW和SW_SHOWNORMAL似乎没有做什么,而SW_RESTORE将恢复记事本但我的VB表单仍然是活动窗口。

我不是程序员,但我错误地告诉我的老板我在高中(十多年前)涉足Pascal Turbo所以我是那个坚持尝试做这项工作的人。我目前的代码是从S.O.拼凑而成的。和其他来源:

(我正在运行Windows 7并使用MVSE2013)

Imports System.Runtime.InteropServices
Public Class Form1
Private Declare Function FindWindow _
       Lib "user32" _
       Alias "FindWindowA" _
      (ByVal lpClassName As String, _
       ByVal lpWindowName As String) As IntPtr

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow As ShowWindowCommands) As Boolean
End Function

Enum ShowWindowCommands As Integer
    SW_SHOWNORMAL = 1
    SW_SHOWMAXIMIZED = 3
    SW_RESTORE = 9
End Enum

Private Sub Form1_Load
    [form]
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click

    Dim lHwnd As IntPtr = FindWindow("Notepad", vbNullString)

    If lHwnd <> IntPtr.Zero Then
        ShowWindow(lHwnd, ShowWindowCommands.SW_SHOWNORMAL)
        SendKeys.Send(TextBox1.Text)
    Else
        [blah blah error handling]
    End If

End Sub

我尝试了另一种技术,比如SetForegroundWindow,但我读到它并不适合Windows 7。

1 个答案:

答案 0 :(得分:0)

找到了我希望PInvoke可以解决的问题。我最终交换了这个块:

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function ShowWindow(ByVal hwnd As IntPtr, ByVal nCmdShow _
As ShowWindowCommands) As Boolean
End Function

为此:

Public Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As IntPtr) As Boolean

然后这一行:

ShowWindow(lHwnd, ShowWindowCommands.SW_SHOWNORMAL)

为此:

BringWindowToTop(lHwnd)

我意识到两者之间存在功能差异,但改变在我的具体实例中有效,所以我很高兴。