#vb.net #background #key #postmessage #ctrl
#vb.net #фон #Клавиша #отправка postmessage #ctrl
Вопрос:
У меня есть этот код, но я не знаю, почему он не работает, кто-нибудь может мне помочь? Мне нужно отправить ctrl f в другое приложение в фоновом режиме
Imports System.Runtime.InteropServices
Public Class Form2
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As UInteger, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Const WM_KEYDOWN = amp;H100
Private Const WM_KEYUP = amp;H101
Private Const WM_CHAR = amp;H102
Private Const WM_SYSKEYDOWN = amp;H104
Private Const WM_SYSKEYUP = amp;H105
Private Const VK_SHIFT = amp;H10
Private Const VK_CONTROL = amp;H11
Private Const KEYEVENTF_EXTENDEDKEY = amp;H1
Private Const KEYEVENTF_KEYUP = amp;H2
Private Const KEYEVENTF_KEYDOWN = amp;H0
Private Const VK_F = amp;H46
Private Const WM_SETTEXT = amp;HC
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal lclassName As String, ByVal windowTitle As String) As IntPtr
End Function
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
Public Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Integer, ByVal wMapType As Integer) As Byte
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim hPadre As IntPtr = FindWindowEx(IntPtr.Zero, hPadre, "Notepad", "Sin título: Bloc de notas")
Dim hCarpetas As IntPtr = FindWindowEx(hPadre, hCarpetas, "Edit", vbNullString)
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYDOWN, 0)
PostMessage(hPadre, WM_KEYDOWN, VK_F, 0)
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)
End Sub
Ответ №1:
У меня также есть этот пример, но он не работает:(
Импортирует System.Runtime.Открытый класс служб взаимодействия Form1
Private Const VK_CONTROL As Integer = 17
Private Const KEYEVENTF_KEYUP As Integer = amp;H2
Private Const INPUT_MOUSE As Integer = 0
Private Const INPUT_KEYBOARD As Integer = 1
Private Const INPUT_HARDWARE As Integer = 2
Private Const WM_KEYDOWN As Integer = amp;H100
Private Structure MOUSEINPUT
Public dx As Integer
Public dy As Integer
Public mouseData As Integer
Public dwFlags As Integer
Public time As Integer
Public dwExtraInfo As IntPtr
End Structure
Private Structure KEYBDINPUT
Public wVk As Integer
Public wScan As Integer
Public dwFlags As Integer
Public time As Integer
Public dwExtraInfo As IntPtr
End Structure
Private Structure HARDWAREINPUT
Public uMsg As Integer
Public wParamL As Integer
Public wParamH As Integer
End Structure
<StructLayout(LayoutKind.Explicit)>
Private Structure INPUT
<FieldOffset(0)>
Public type As Integer
<FieldOffset(4)>
Public mi As MOUSEINPUT
<FieldOffset(4)>
Public ki As KEYBDINPUT
<FieldOffset(4)>
Public hi As HARDWAREINPUT
End Structure
<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, ByVal lclassName As String, ByVal windowTitle As String) As IntPtr
End Function ' Dany
Private Declare Function SendInput Lib "user32" (ByVal nInputs As Integer, ByVal pInputs() As INPUT, ByVal cbSize As Integer) As Integer
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As IntPtr, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Integer, ByVal bScan As Byte, ByVal dwFlags As IntPtr, ByVal dwExtraInfo As IntPtr)
Private Sub wait(ByVal interval As Integer)
Dim sw As New Stopwatch
sw.Start()
Do While sw.ElapsedMilliseconds < interval
' Allows UI to remain responsive
Application.DoEvents()
Loop
sw.Stop()
End Sub
Private Sub SendKey(ByVal bKey As Integer)
Dim GInput(0) As INPUT
' press the key
GInput(0).type = INPUT_KEYBOARD
GInput(0).ki.wVk = bKey
GInput(0).ki.dwFlags = 0
SendInput(2, GInput, Marshal.SizeOf(GetType(INPUT)))
End Sub
Sub Press_Control()
wait(2000)
Dim b As Integer
b = VK_CONTROL
SendKey(b)
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim hPadre As IntPtr = FindWindowEx(IntPtr.Zero, hPadre, "Notepad", "Sin título: Bloc de notas")
Dim hCarpetas As IntPtr = FindWindowEx(hPadre, hCarpetas, "Edit", vbNullString)
Press_Control()
SendMessage(hPadre, WM_KEYDOWN, 70, 0)
wait(1000)
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP, 0)
End Sub