ControlSend über user32.dll / Win_API

  • Hallo,

    ich stehe vor einem Problem :(
    ControlSend ist ansich ein wundervoller Befehl um Strings in inaktive Fenster zu senden, leider hat er die gemeine Angewohnheit, dass wenn zuviele auf einmail auftauchen, dass der PC anfängt mit spinnen. Er aktiviert z. B. ständig die SHIFT Taste oder wenn man das '@' Symbol schreiben will, dann darf man erstmal den PC neu starten, bevor der linke Mausklick + schreiben wieder funktioniert.

    Für ControlClick habe ich eine wunderbare Alternative gefunden. Hier das Script:

    Spoiler anzeigen
    [autoit]

    Func MakeLong($LoWord, $HiWord)
    Return BitOR($HiWord * 0x10000, BitAND($LoWord, 0xFFFF))
    EndFunc ;==>MakeLong

    [/autoit] [autoit][/autoit] [autoit]

    Func MouseSend($btn, $evt, $xpos, $ypos)
    $user32 = DllOpen("user32.dll")
    If $user32 = -1 Then
    ConsoleWrite("MouseSend: cannot open user32.dll")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $MK_LBUTTON = 0x0001
    $WM_LBUTTONDOWN = 0x0201
    $WM_LBUTTONUP = 0x0202
    $MK_RBUTTON = 0x0002
    $WM_RBUTTONDOWN = 0x0204
    $WM_RBUTTONUP = 0x0205
    $WM_MOUSEMOVE = 0x0200

    [/autoit] [autoit][/autoit] [autoit]

    If $btn = "left" Then
    $button = $MK_LBUTTON
    $btdown = $WM_LBUTTONDOWN
    $btup = $WM_LBUTTONUP
    ElseIf $btn = "right" Then
    $button = $MK_RBUTTON
    $btdown = $WM_RBUTTONDOWN
    $btup = $WM_RBUTTONUP
    ElseIf $btn = "none" Then
    If Not ($evt = "move") Then
    ConsoleWrite(StringFormat("MouseSend: bad call: %s , %s", $btn, $evt))
    Exit
    EndIf
    Else ;error
    ConsoleWrite(StringFormat("MouseSend: bad button: %s", $btn))
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $pos = MakeLong($xpos, $ypos)
    Select
    Case $evt = "move"
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_MOUSEMOVE, "int", 0, "long", $pos)
    Case $evt = "down"
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $btdown, "int", $button, "long", $pos)
    Case $evt = "up"
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $btup, "int", $button, "long", $pos)
    Case $evt = "click"
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_MOUSEMOVE, "int", 0, "long", $pos)
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $btdown, "int", $button, "long", $pos)
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $btup, "int", $button, "long", $pos)
    Case $evt = "dclick"
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_MOUSEMOVE, "int", 0, "long", $pos)
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $btdown, "int", $button, "long", $pos)
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $btup, "int", $button, "long", $pos)
    Sleep(20)
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $WM_MOUSEMOVE, "int", 0, "long", $pos)
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $btdown, "int", $button, "long", $pos)
    DllCall($user32, "int", "PostMessage", "hwnd", $hwnd, "int", $btup, "int", $button, "long", $pos)
    EndSelect
    If $user32 <> -1 Then DllClose($user32)
    EndFunc ;==>MouseSend

    [/autoit]

    Nun bin ich auf der Suche nach einer Funktion, die das selbige mit der Tastatur macht. Wenn Taste 'A' gedrückt wird, soll er das ganze über einen DllCall mit der sehr zuverlässigen user32.dll machen ... .

    Freue mich über alle Antworten :)

    Laut dem API-Helper sind das hier die entsprechenden Buttons:

    Spoiler anzeigen

    Declare Sub keybd_event Lib "user32.dll" Alias "keybd_event" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As DWord, ByVal dwExtraInfo As DWord)

    Spoiler anzeigen

    * bVk Erwartet eine der Tastaturkonstanten die eine der Tastaturtasten beschreibt.
    bVk Konstanten:
    Const VK_LBUTTON = &H1 'Linker Mausbutton
    Const VK_RBUTTON = &H2 'Rechter Mausbutton
    Const VK_MBUTTON = &H4 'Mittlerer Masubutton
    Const VK_BACK = &H8 'Backspace Taste
    Const VK_TAB = &H9 'Tab Taste
    Const VK_CLEAR = &HC 'Numpad 5 ohne Numlock
    Const VK_RETURN = &HD 'Enter Taste
    Const VK_SHIFT = &H10 'Shift Taste
    Const VK_CONTROL = &H11 'STRG Taste
    Const VK_MENU = &H12 'Alt Taste
    Const VK_PAUSE = &H13 'Pause/Untbr
    Const VK_CAPITAL = &H14 'Caps Lock/Feststelltaste
    Const VK_ESCAPE = &H1B 'Escape
    Const VK_SPACE = &H20 'Space/Leertaste
    Const VK_PRIOR = &H21 'PageUp/Bild hoch
    Const VK_NEXT = &H22 'PageDown/Bild runter
    Const VK_END = &H23 'Ende
    Const VK_HOME = &H24 'Home/Pos1
    Const VK_LEFT = &H25 'Linke Pfeiltaste
    Const VK_UP = &H26 'Obere Pfeilaste
    Const VK_RIGHT = &H27 'Rechte Pfeiltaste
    Const VK_DOWN = &H28 'Untee Pfeiltaste
    Const VK_PRINT = &H2A 'Drucken (Nokia Tastaturen)
    Const VK_SNAPSHOT = &H2C 'Drucken/S-Abf
    Const VK_INSERT = &H2D 'Einfügen
    Const VK_DELETE = &H2E 'Entfernen
    Const VK_HELP = &H2F 'Hilfe
    Const VK_0 = &H30 'Taste 0
    Const VK_1 = &H31 'Taste 1
    Const VK_2 = &H32 'Taste 2
    Const VK_3 = &H33 'Taste 3
    Const VK_4 = &H34 'Taste 4
    Const VK_5 = &H35 'Taste 5
    Const VK_6 = &H36 'Taste 6
    Const VK_7 = &H37 'Taste 7
    Const VK_8 = &H38 'Taste 8
    Const VK_9 = &H39 'Taste 9
    Const VK_A = &H41 'Taste A
    Const VK_B = &H42 'Taste B
    Const VK_C = &H43 'Taste C
    Const VK_D = &H44 'Taste D
    Const VK_E = &H45 'Taste E
    Const VK_F = &H46 'Taste F
    Const VK_G = &H47 'Taste G
    Const VK_H = &H48 'Taste H
    Const VK_I = &H49 'Taste I
    Const VK_J = &H4A 'Taste J
    Const VK_K = &H4B 'Taste K
    Const VK_L = &H4C 'Taste L
    Const VK_M = &H4D 'Taste M
    Const VK_N = &H4E 'Taste N
    Const VK_O = &H4F 'Taste O
    Const VK_P = &H50 'Taste P
    Const VK_Q = &H51 'Taste Q
    Const VK_R = &H52 'Taste R
    Const VK_S = &H53 'Taste S
    Const VK_T = &H54 'Taste T
    Const VK_U = &H55 'Taste U
    Const VK_V = &H56 'Taste V
    Const VK_W = &H57 'Taste W
    Const VK_X = &H58 'Taste X
    Const VK_Y = &H59 'Taste Y
    Const VK_Z = &H5A 'Taste Z
    Const VK_STARTKEY = &H5B 'Startmenütaste
    Const VK_CONTEXTKEY = &H5D 'Kentextmenü
    Const VK_NUMPAD0 = &H60 'Numpad Taste 0
    Const VK_NUMPAD1 = &H61 'Numpad Taste 1
    Const VK_NUMPAD2 = &H62 'Numpad Taste 2
    Const VK_NUMPAD3 = &H63 'Numpad Taste 3
    Const VK_NUMPAD4 = &H64 'Numpad Taste 4
    Const VK_NUMPAD5 = &H65 'Numpad Taste 5
    Const VK_NUMPAD6 = &H66 'Numpad Taste 6
    Const VK_NUMPAD7 = &H67 'Numpad Taste 7
    Const VK_NUMPAD8 = &H68 'Numpad Taste 8
    Const VK_NUMPAD9 = &H69 'Numpad Taste 9
    Const VK_MULTIPLY = &H6A 'Numpad Multiplikations Taste (*)
    Const VK_ADD = &H6B 'Numpad Additions Taste (+)
    Const VK_SUBTRACT = &H6D 'Numpad Subtrations Taste (-)
    Const VK_DECIMAL = &H6E 'Numpad Komma Taste (,)
    Const VK_DIVIDE = &H6F 'Numpad Devidierungs Taste (/)
    Const VK_F1 = &H70 'F1 Taste
    Const VK_F2 = &H71 'F2 Taste
    Const VK_F3 = &H72 'F3 Taste
    Const VK_F4 = &H73 'F4 Taste
    Const VK_F5 = &H74 'F5 Taste
    Const VK_F6 = &H75 'F6 Taste
    Const VK_F7 = &H76 'F7 Taste
    Const VK_F8 = &H77 'F8 Taste
    Const VK_F9 = &H78 'F9 Taste
    Const VK_F10 = &H79 'F10 Taste
    Const VK_F11 = &H7A 'F11 Taste
    Const VK_F12 = &H7B 'F12 Taste
    Const VK_F13 = &H7C 'F13 Taste
    Const VK_F14 = &H7D 'F14 Taste
    Const VK_F15 = &H7E 'F15 Taste
    Const VK_F16 = &H7F 'F16 Taste
    Const VK_F17 = &H80 'F17 Taste
    Const VK_F18 = &H81 'F18 Taste
    Const VK_F19 = &H82 'F19 Taste
    Const VK_F20 = &H83 'F20 Taste
    Const VK_F21 = &H84 'F21 Taste
    Const VK_F22 = &H85 'F22 Taste
    Const VK_F23 = &H86 'F23 Taste
    Const VK_F24 = &H87 'F24 Taste
    Const VK_NUMLOCK = &H90 'Numlock Taste
    Const VK_OEM_SCROLL = &H91 'Scroll Lock
    Const VK_LSHIFT = &HA0 'Linke Shift-Taste
    Const VK_RSHIFT = &HA1 'Rechte Shift-Taste
    Const VK_LCONTROL = &HA2 'Linke STRG-Taste
    Const VK_RCONTROL = &HA3 'Rechte STRG-Taste
    Const VK_LMENU = &HA4 'Linke ALT-Taste
    Const VK_RMENU = &HA5 'Rechte ALT-Taste
    Const VK_OEM_1 = &HBA '";"-Taste
    Const VK_OEM_PLUS = &HBB '"
    Const VK_OEM_COMMA = &HBC '","-Taste
    Const VK_OEM_MINUS = &HBD '"-"-Taste
    Const VK_OEM_PERIOD = &HBE '"."-taste
    Const VK_OEM_2 = &HBF '"/"-Taste
    Const VK_OEM_3 = &HC0 '"`"-Taste
    Const VK_OEM_4 = &HDB '"["-Taste
    Const VK_OEM_5 = &HDC '"\"-Taste
    Const VK_OEM_6 = &HDD '"]"-Taste
    Const VK_OEM_7 = &HDE '"
    Const VK_ICO_F17 = &HE0 'F17 einer Olivette Tastatur (Intern)
    Const VK_ICO_F18 = &HE1 'F18 einer Olivette Tastatur (Intern)
    Const VK_OEM102 = &HE2 '"<"-Taste oder " "-Taste einer IBM-Kompatiblen 102 Tastatur (Nicht US)
    Const VK_ICO_HELP = &HE3 'Hilfetaste einer Olivetti Tastatur (Intern)
    Const VK_ICO_00 = &HE4 '00-Taste einer Olivetti Tastatur (Intern)
    Const VK_ICO_CLEAR = &HE6 'Löschen Taste einer Olivetti Tastatur (Intern)
    Const VK_OEM_RESET = &HE9 'Reset Taste (Nokia)
    Const VK_OEM_JUMP = &HEA 'Springen Taste (Nokia)
    Const VK_OEM_PA1 = &HEB 'PA1 Taste (Nokia)
    Const VK_OEM_PA2 = &HEC 'PA2 Taste (Nokia)
    Const VK_OEM_PA3 = &HED 'PA3 Taste (Nokia)
    Const VK_OEM_WSCTRL = &HEE 'WSCTRL Taste (Nokia)
    Const VK_OEM_CUSEL = &HEF 'WSCTRL Taste (Nokia)
    Const VK_OEM_ATTN = &HF0 'ATTN Taste (Nokia)
    Const VK_OEM_FINNISH = &HF1 'Fertig Taste (Nokia)
    Const VK_OEM_COPY = &HF2 'Kopieren Taste (Nokia)
    Const VK_OEM_AUTO = &HF3 'Auto Taste (Nokia)
    Const VK_OEM_ENLW = &HF4 'ENLW Taste (Nokia)
    Const VK_OEM_BACKTAB = &HF5 'BackTab Taste (Nokia)
    Const VK_ATTN = &HF6 'ATTN-Taste
    Const VK_CRSEL = &HF7 'CRSEL-Taste
    Const VK_EXSEL = &HF8 'EXSEL-Taste
    Const VK_EREOF = &HF9 'EREOF-Taste
    Const VK_PLAY = &HFA 'PLAY-Taste
    Const VK_ZOOM = &HFB 'ZOOM-Taste
    Const VK_NONAME = &HFC 'NONAME-Taste
    Const VK_PA1 = &HFD 'PA1-Taste
    Const VK_OEM_CLEAR = &HFE 'OEM_CLEAR-Taste
    * bScan Reserviert, setzen sie diesen Wert auf "0".
    * dwFlags Erwartet eine der folgenden Konstanten die weitere Optionen der Tastatureingabe beschreiben.
    dwFlags Konstanten:
    Const KEYEVENTF_EXTENDEDKEY = &H1 'Erweiterte Tastatureingabe
    Const KEYEVENTF_KEYUP = &H2 'Die angegebene Taste wird losgelassen
    * dwExtraInfo Erwartet erweiterte 32-Bit Werte für die Tastatureingabe falls benötigt. Alternativ kann hier der Wert "0" übergeben werden.

    3 Mal editiert, zuletzt von Crypto-X (8. Januar 2009 um 23:48)

  • Nein, das ist leider auch nicht das was ich auf Dauer suche ;)
    Deshalb speziell die user32.dll und ihre Möglichkeiten ^^

    Ich hab mir da mit etwas Hilfe zusammen gebastelt ... funkt leider noch nicht ganz so dolle, aber wird noch.

    Das hier braucht man ..

    [autoit]

    Dim $Keys[0xFF + 1]

    [/autoit][autoit][/autoit][autoit]

    For $i = 1 To 0xFF
    $Chr = DllCall("user32.dll", "int", "MapVirtualKey", "int", $i, "int", 2)
    $Chr = StringLower(ChrW(BitAND($Chr[0], 0xFFFF)))
    $Keys[$i] = $Chr
    Next

    [/autoit][autoit][/autoit][autoit]

    Func VirChar($Chr)
    $Chr = String($Chr)
    For $i = 1 To 0xFF
    If $Keys[$i] = $Chr Then Return $i
    Next
    EndFunc ;==>_GetVK

    [/autoit]

    Das hier ist mein Code den ich zusammengeschustert habe:

    [autoit]

    Func CSend($hwnd0, $txt, $time = 100)
    $hwnd = WinGetHandle($hwnd0)
    $Keys = StringLen($txt)
    $Atxt = StringSplit($txt, "")
    For $i = 1 To $Keys
    _WinAPI_PostMessage($hwnd, $WM_KEYDOWN, VirChar($Atxt[$i]), 0)
    Sleep($time / 2)
    _WinAPI_PostMessage($hwnd, $WM_KEYup, VirChar($Atxt[$i]), 0)
    Sleep($time / 2)
    Next
    EndFunc ;==>CSend

    [/autoit]

    Nur so wird man wohl keine Tasten wie SPACE/ENTER/... drücken können, wenn ich mich nicht irre. Wobei er es vlt. mit den {}-Klammern sehen müsste.

  • _SendMessage benutzt auch die User32.dll

    Spoiler anzeigen
    [autoit]

    #include <sendmessage.au3>
    #include <windowsconstants.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $pid=Run("notepad")
    WinWait("[CLASS:Notepad]")
    WinActivate("[CLASS:Notepad]")
    $controlhwnd=ControlGetHandle("[CLASS:Notepad]","","[CLASS:Edit]")

    [/autoit] [autoit][/autoit] [autoit]

    For $i=0x20 To 0x39
    _SendMessage($controlhwnd,$WM_CHAR,$i)
    Next

    [/autoit]