我正在尝试在外部应用程序的mdi子窗口上使用sendinput API来向其发送键/鼠标输入以进行数学运算。我有窗口句柄id并使用setfocus windows API来setfocus,但sendinput不会发送密钥。我选择允许数字值的接收控件。另外,我需要将一些数值作为十进制输入发送,例如3.3。如果您需要外部应用程序的图像,请在下面评论,我将在我的Google云端硬盘帐户上发布图片。
......
Dim hNoteThread As IntPtr = GetWindowThreadProcessId(windowids(foundid), IntPtr.Zero)
If hNoteThread <> 0 Then
MsgBox("Panel 0 found for input")
End If
' SetForegroundWindow(windowids(foundid))
If AttachThreadInput(GetCurrentThreadId(), hNoteThread, True) = True Then
SetFocus(windowids(foundid))
System.Threading.Thread.Sleep(1000)
SendKey(VK_TAB)
System.Threading.Thread.Sleep(2000)
SendKey(VK_NUMPAD2)
System.Threading.Thread.Sleep(2000)
SendKey(VK_TAB)
SendKey(VK_NUMPAD0 + VK_DECIMAL + VK_NUMPAD5)
' System.Threading.Thread.Sleep(1000)
SendKey(VK_TAB)
SendKey(VK_NUMPAD1)
' System.Threading.Thread.Sleep(1000)
SendKey(VK_TAB)
SendKey(VK_NUMPAD2)
System.Threading.Thread.Sleep(2000)
MsgBox("keys sent")
Else
MsgBox("keys not sent")
End If
Private Sub SendKey(ByVal bKey As Short)
Dim GInput(1) As INPUT
' press the key
GInput(0).type = INPUT_KEYBOARD
GInput(0).ki.wVk = bKey
GInput(0).ki.dwFlags = 0
' release the key
GInput(1).type = INPUT_KEYBOARD
GInput(1).ki.wVk = bKey
GInput(1).ki.dwFlags = KEYEVENTF_KEYUP
SendInput(2, GInput, Marshal.SizeOf(GetType(INPUT)))
End Sub
编辑:这是一个图像链接,这样有人可以弄清楚输入是如何发送的: https://drive.google.com/file/d/0BwIppJC0dxJBalp3Ykd2VzZkQ0E/edit?usp=sharing
发送输入的目标控件是Psi,D,以及可以在Panel0中更改的其他值,我也需要单击该按钮。
问题是发送输入无法正常工作,我的消息框显示输入已被发送。
答案 0 :(得分:0)
我发现该按钮是一个应用程序绘制按钮,因此它没有手柄!此外,其他控件也可能已被绘制。我觉得很蠢。我最终获得了mainform和子窗体的句柄,然后通过除按钮之外的不同控件进行选项卡。对于按钮:我使用RECT类获取窗口的左下角并保持移动x,直到我到达按钮的最左边角,同时使用sendinput单击。 如果您想要来源,请在下面评论。它太大了,不能在这里发布。