我正在尝试通过小型 VB 表单将自动击键发送到不支持复制+粘贴的应用程序。该表单从文本文件加载数据,并在我单击按钮后使用 SendKeys 将其触发。
除了 ShowWindow 部分之外,一切似乎都可以正常工作。我目前正在使用记事本进行测试,除了一个例外,我似乎无法让 ShowWindow 将焦点转移到记事本上。显然我担心它会对我最终运行它的应用程序做同样的事情(我目前无权访问它)。使记事本处于活动状态的唯一 ShowWindow 参数是 SW_SHOWMAXIMIZED。SW_SHOW 和 SW_SHOWNORMAL 似乎没有做任何事情,而 SW_RESTORE 如果最小化将恢复记事本,但我的 VB 表单仍然是活动窗口。
我不是程序员,但我犯了一个错误,告诉我的老板我在高中(十多年前)涉足 Pascal Turbo,所以我是那个坚持尝试完成这项工作的人。我当前的代码是从 SO 和其他来源拼凑而成的:
(我正在运行 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 上效果不佳。