Einfaches Automate-Module

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Einfaches Automate-Module

Beitrag von ccode_new »

Hallo Leute,

ich habe mal die Maus- und Tasten- Simulierungsbefehle zu einem Modul zusammengefasst.

Es funktioniert unter Windows und Linux und Mac. (Eingeschränkt !)

Code: Alles auswählen

DeclareModule Simulate
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    ;- Linux-Keys
    #XBackSpace = $FF08
    #XTab = $FF09
    #XLineFeed = $FF0A
    #XClear = $FF0B
    #XReturn = $FF0D
    #XPause = $FF13
    #XScroll_Lock = $FF14
    #XSys_Req = $FF15
    #XEscape = $FF1B
    #XDelete = $FFFF
    #XMulti_key = $FF20
    #XCodeinput = $FF37
    #XSingleCandidate = $FF3C
    #XMultipleCandidate = $FF3D
    #XPreviousCandidate = $FF3E
    #XHome = $FF50
    #XLeft = $FF51
    #XUp = $FF52
    #XRight = $FF53
    #XDown = $FF54
    #XPage_Up = $FF55
    #XPage_Down = $FF56
    #XEnd = $FF57
    #XBegin = $FF58
    #XSelect = $FF60
    #XPrint = $FF61
    #XExecute = $FF62
    #XInsert = $FF63
    #XUndo = $FF65
    #XRedo = $FF66
    #XMenu = $FF67
    #XFind = $FF68
    #XCancel = $FF69
    #XHelp = $FF6A
    #XBreak = $FF6B
    #XNum_Lock = $FF7F
    Enumeration F
      #XF1 = $FFBE
      #XF2
      #XF3
      #XF4
      #XF5
      #XF6
      #XF7
      #XF8
      #XF9
      #XF10
      #XF11
      #XF12
    EndEnumeration
    #XShift_L = $FFE1
    #XShift_R = $FFE2
    #XControl_L = $FFE3
    #XControl_R = $FFE4
    #XCaps_Lock = $FFE5
    #XShift_Lock = $FFE6
    #XMeta_L = $FFE7
    #XMeta_R = $FFE8
    #XAlt_L = $FFE9
    #XAlt_R = $FFEA
    #XSuper_L = $FFEB
    #XSuper_R = $FFEC
    #XHyper_L = $FFED
    #XHyper_R = $FFEE
  CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
    #VK_A                    = $00
    #VK_S                    = $01
    #VK_D                    = $02
    #VK_F                    = $03
    #VK_H                    = $04
    #VK_G                    = $05
    #VK_Z                    = $06
    #VK_X                    = $07
    #VK_C                    = $08
    #VK_V                    = $09
    #VK_B                    = $0B
    #VK_Q                    = $0C
    #VK_W                    = $0D
    #VK_E                    = $0E
    #VK_R                    = $0F
    #VK_Y                    = $10
    #VK_T                    = $11
    #VK_1                    = $12
    #VK_2                    = $13
    #VK_3                    = $14
    #VK_4                    = $15
    #VK_6                    = $16
    #VK_5                    = $17
    #VK_Equal                = $18
    #VK_9                    = $19
    #VK_7                    = $1A
    #VK_Minus                = $1B
    #VK_8                    = $1C
    #VK_0                    = $1D
    #VK_RightBracket         = $1E
    #VK_O                    = $1F
    #VK_U                    = $20
    #VK_LeftBracket          = $21
    #VK_I                    = $22
    #VK_P                    = $23
    #VK_L                    = $25
    #VK_J                    = $26
    #VK_Quote                = $27
    #VK_K                    = $28
    #VK_Semicolon            = $29
    #VK_Backslash            = $2A
    #VK_Comma                = $2B
    #VK_Slash                = $2C
    #VK_N                    = $2D
    #VK_M                    = $2E
    #VK_Period               = $2F
    #VK_Grave                = $32
    #VK_KeypadDecimal        = $41
    #VK_KeypadMultiply       = $43
    #VK_KeypadPlus           = $45
    #VK_KeypadClear          = $47
    #VK_KeypadDivide         = $4B
    #VK_KeypadEnter          = $4C
    #VK_KeypadMinus          = $4E
    #VK_KeypadEquals         = $51
    #VK_Keypad0              = $52
    #VK_Keypad1              = $53
    #VK_Keypad2              = $54
    #VK_Keypad3              = $55
    #VK_Keypad4              = $56
    #VK_Keypad5              = $57
    #VK_Keypad6              = $58
    #VK_Keypad7              = $59
    #VK_Keypad8              = $5B
    #VK_Keypad9              = $5C
    
    #VK_Return                    = $24
    #VK_Tab                       = $30
    #VK_Space                     = $31
    #VK_Delete                    = $33
    #VK_Escape                    = $35
    #VK_Command                   = $37
    #VK_Shift                     = $38
    #VK_CapsLock                  = $39
    #VK_Option                    = $3A
    #VK_Control                   = $3B
    #VK_RightShift                = $3C
    #VK_RightOption               = $3D
    #VK_RightControl              = $3E
    #VK_Function                  = $3F
    #VK_F17                       = $40
    #VK_VolumeUp                  = $48
    #VK_VolumeDown                = $49
    #VK_Mute                      = $4A
    #VK_F18                       = $4F
    #VK_F19                       = $50
    #VK_F20                       = $5A
    #VK_F5                        = $60
    #VK_F6                        = $61
    #VK_F7                        = $62
    #VK_F3                        = $63
    #VK_F8                        = $64
    #VK_F9                        = $65
    #VK_F11                       = $67
    #VK_F13                       = $69
    #VK_F16                       = $6A
    #VK_F14                       = $6B
    #VK_F10                       = $6D
    #VK_F12                       = $6F
    #VK_F15                       = $71
    #VK_Help                      = $72
    #VK_Home                      = $73
    #VK_PageUp                    = $74
    #VK_ForwardDelete             = $75
    #VK_F4                        = $76
    #VK_End                       = $77
    #VK_F2                        = $78
    #VK_PageDown                  = $79
    #VK_F1                        = $7A
    #VK_LeftArrow                 = $7B
    #VK_RightArrow                = $7C
    #VK_DownArrow                 = $7D
    #VK_UpArrow                   = $7E
    
  CompilerEndIf
  
  Declare ComputerKey(key.i, is_press.b = 1, option.b = 0, char_mode.b = 0)
  Declare ComputerMouse(posx.d, posy.d, key.w = 0, is_press.b = 1, option.b = 0) ;key = 0 (Left) / key = 1 (Right) / key = 2 (Middle)
                                                                                 ;Declare Ghost(write.s, delay.i)
  
EndDeclareModule

Module Simulate
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    
    ImportC "-lX11"
      XOpenDisplay(*display)
      XCloseDisplay(*display)
      XDefaultScreen(*display)
      XStringToKeysym(string.p-utf8)
      XKeysymToString(keysym)
      XKeysymToKeycode(*display, keysym)
      XFlush(display)
    EndImport
    
    ImportC "-lXtst"
      XTestFakeKeyEvent(display, keycode, is_press, delay)
      XTestFakeButtonEvent(display, button, is_press, delay)
      XTestFakeMotionEvent(display, screen_number, x, y, delay)
    EndImport
    
  CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
    
    #kCGEventFlagMaskShift     = $020000 ; = NX_SHIFTMASK
    #kCGEventFlagMaskControl   = $040000 ; = NX_CONTROLMASK
    #kCGEventFlagMaskAlternate = $080000 ; = NX_ALTERNATEMASK
    #kCGEventFlagMaskCommand   = $100000 ; = NX_COMMANDMASK
    
    ImportC ""
      CFRelease(CFTypeRef.i)
      CGEventCreate(CGEventSourceRef.i)
      CGEventCreateKeyboardEvent(CGEventSourceRef.i, CGVirtualKeyCode.u, KeyDown.l)
      CGEventCreateMouseEvent(CGEventSourceRef.i, MouseEventType.i, x.d, y.d, MouseButton.i)
      CGEventPost(CGEventTapLocation.l, CGEventRef.i)
      CGEventSetFlags(CGEventRef.i, CGEventFlags.l)
      CGEventGetLocation(CGEventRef.i)
      CGEventSetIntegerValueField(CGEventRef.i, CGEventField.i, value.q)
    EndImport
    
  CompilerEndIf
  
  
  Procedure ComputerKey(key.i, is_press.b = 1, option.b = 0, char_mode.b = 0)
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      If option = 0
        Protected TipTap.INPUT
        TipTap\Type = #INPUT_KEYBOARD
        If is_press = 1
          If char_mode = 1
            TipTap\ki\wScan = key
            TipTap\ki\dwFlags = 4
          Else
            TipTap\ki\wVk = key
            TipTap\ki\dwFlags = 0
          EndIf
        ElseIf is_press = 0
          If char_mode = 1
            TipTap\ki\wScan = key
            TipTap\ki\dwFlags = 4 | #KEYEVENTF_KEYUP
          Else
            TipTap\ki\wVk = key
            TipTap\ki\dwFlags = #KEYEVENTF_KEYUP
          EndIf
        EndIf
        SendInput_(1, @TipTap, SizeOf(INPUT))
      ElseIf option = 1
        If is_press = 1
          If char_mode = 1
            keybd_event_(0, key,  4, 0)
          Else
            keybd_event_(key, 0, 0, 0)
          EndIf
        Else
          If char_mode = 1
            keybd_event_(0, key, 4 | #KEYEVENTF_KEYUP, 0)
          Else
            keybd_event_(key, 0, #KEYEVENTF_KEYUP, 0)
          EndIf
        EndIf
      EndIf
    CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
      Protected *display = XOpenDisplay(0)
      code = XkeysymTokeycode(*display, key)
      XTestFakekeyEvent(*display, code, is_press, 0)
      XFlush(*display)
      XCloseDisplay(*display)
    CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
      Protected TipTap.i
      If is_press = 1
        TipTap = CGEventCreateKeyboardEvent(0, key, #True)
      Else
        TipTap = CGEventCreateKeyboardEvent(0, key, #False)
      EndIf
      If TipTap
        If option = 1
          CGEventSetFlags(TipTap, #kCGEventFlagMaskShift)
        ElseIf option = 2
          CGEventSetFlags(TipTap, #kCGEventFlagMaskControl)
        ElseIf option = 3
          CGEventSetFlags(TipTap, #kCGEventFlagMaskCommand)
        ElseIf option = 4
          CGEventSetFlags(TipTap, #kCGEventFlagMaskAlternate)
        Else
          CGEventSetFlags(TipTap, 0)
        EndIf
        CGEventPost(0, TipTap)
        CFRelease(TipTap)
      EndIf
    CompilerEndIf
  EndProcedure
  
  Procedure ComputerMouse(posx.d, posy.d, key.w = 0, is_press.b = 1, option.b = 0) ;key = 0 (Left) / key = 1 (Right) / key = 2 (Middle)
    CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      If option = 0
        Protected Miau.INPUT
        Miau\Type=#INPUT_MOUSE
        If is_press = 1
          If key = 0
            Miau\mi\dwFlags = #MOUSEEVENTF_LEFTDOWN
          ElseIf key = 1
            Miau\mi\dwFlags = #MOUSEEVENTF_RIGHTDOWN
          ElseIf key = 2
            Miau\mi\dwFlags = #MOUSEEVENTF_MIDDLEDOWN
          EndIf
        Else
          If key = 0
            Miau\mi\dwFlags = #MOUSEEVENTF_LEFTUP
          ElseIf key = 1
            Miau\mi\dwFlags = #MOUSEEVENTF_RIGHTUP
          ElseIf key = 2
            Miau\mi\dwFlags = #MOUSEEVENTF_MIDDLEUP
          EndIf
        EndIf
        SetCursorPos_(posx, posy)
        SendInput_(1, @Miau, SizeOf(INPUT))
      Else
        Protected MouseAreaWidth.i  = GetSystemMetrics_( #SM_CXSCREEN )-1
        Protected MouseAreaHeight.i  = GetSystemMetrics_( #SM_CYSCREEN )-1
        Protected mx.i = posx * (65535 / MouseAreaWidth)
        Protected my.i = posy * (65535 / MouseAreaHeight)
        If is_press = 1
          If key = 0
            mouse_event_(#MOUSEEVENTF_LEFTDOWN | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
          ElseIf key = 1
            mouse_event_(#MOUSEEVENTF_RIGHTDOWN | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
          ElseIf key = 2
            mouse_event_(#MOUSEEVENTF_MIDDLEDOWN | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
          EndIf
        Else
          If key = 0
            mouse_event_(#MOUSEEVENTF_LEFTUP | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
          ElseIf key = 1
            mouse_event_(#MOUSEEVENTF_RIGHTUP | #MOUSEEVENTF_MOVE  | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
          ElseIf key = 2
            mouse_event_(#MOUSEEVENTF_MIDDLEUP | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
          EndIf
        EndIf
      EndIf
    CompilerElseIf #PB_Compiler_OS = #PB_OS_Linux
      Protected *display = XOpenDisplay(0)
      XTestFakeMotionEvent(*display, XDefaultScreen(*display), posx, posy, 0)
      If key = 0
        XTestFakeButtonEvent(*display, 1, is_press, 0)
      ElseIf key = 1
        XTestFakeButtonEvent(*display, 3, is_press, 0)
      ElseIf key = 2
        XTestFakeButtonEvent(*display, 2, is_press, 0)
      EndIf
      XFlush(*display)
      XCloseDisplay(*display)
    CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
      Protected Miau.i
      If key = 0
        If is_press = 1
          Miau = CGEventCreateMouseEvent(0, 1, posx, posy, 0)
        Else
          Miau = CGEventCreateMouseEvent(0, 2, posx, posy, 0)
        EndIf
      ElseIf key = 1
        If is_press = 1
          Miau = CGEventCreateMouseEvent(0, 3, posx, posy, 1)
        Else
          Miau = CGEventCreateMouseEvent(0, 4, posx, posy, 1)
        EndIf
      ElseIf key = 2
        ;?
      EndIf
      If Miau
        CGEventPost(0, Miau)
        CFRelease(Miau)
      EndIf
    CompilerEndIf
  EndProcedure
  
  ;   Procedure Ghost(write.s, delay.i)
  ;     Protected g
  ;     ;Windows-Char-Mode (Only letters and numbers)
  ;     For g = 1 To Len(write)
  ;       ComputerKey(Asc(Mid(write,g,1)), 1, 0, 1)
  ;       ComputerKey(Asc(Mid(write,g,1)), 0, 0, 1)
  ;       Delay(delay)
  ;     Next g
  ;   EndProcedure
  
EndModule

;-Main
CompilerIf #PB_Compiler_IsMainFile
  UseModule Simulate
  
  CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    
    RunProgram("gedit", "", "")
    Delay(3000)
    
    ;ComputerMouse(100, 100, 0)
    ;ComputerMouse(100, 100, 0, 0)
    
    ComputerKey(#XShift_L, #True)
    ComputerKey('H', #True)
    ComputerKey('H', #False)
    ComputerKey(#XShift_L, #False)
    
    ComputerKey(#PB_Key_A, #True)
    ComputerKey(#PB_Key_A, #False)
    
    ComputerKey('L', #True)
    ComputerKey('L', #False)
    
    ComputerKey(#PB_Key_L)
    ComputerKey(#PB_Key_L, #False)
    
    ComputerKey('O')
    ComputerKey('O', #False)
    
    ComputerKey(#PB_Key_Space, #True)
    ComputerKey(#PB_Key_Space, #False)
    
    ComputerKey(#XShift_L)
    ComputerKey('L', #True)
    ComputerKey('L', #False)
    ComputerKey(#XShift_L, 0)
    
    ComputerKey(#PB_Key_I)
    ComputerKey(#PB_Key_I, 0)
    
    ComputerKey('n', 1)
    ComputerKey('n', 0)
    
    ComputerKey(#PB_Key_U, 1)
    ComputerKey(#PB_Key_U, 0)
    
    ComputerKey(120, 1)
    ComputerKey(120, 0)
    
    ComputerKey(#XShift_L)
    ComputerKey('!', 1)
    ComputerKey('!', 0)
    ComputerKey(#XShift_L, 0)
    
  CompilerElseIf #PB_Compiler_OS = #PB_OS_Windows
    
    RunProgram("notepad.exe")
    Delay(3000)
    
    ;ComputerMouse(100, 100, 0)
    ;ComputerMouse(100, 100, 0, 0)
    
    ComputerKey(#VK_LSHIFT, #True)
    ComputerKey('H', #True)
    ComputerKey('H', #False)
    ComputerKey(#VK_LSHIFT, #False)
    
    ComputerKey(#VK_A, #True)
    ComputerKey(#VK_A, #False)
    
    ComputerKey('L', #True)
    ComputerKey('L', #False)
    
    ComputerKey(#VK_L)
    ComputerKey(#VK_L, #False)
    
    ComputerKey('O')
    ComputerKey('O', #False)
    
    ComputerKey(#VK_SPACE, #True)
    ComputerKey(#VK_SPACE, #False)
    
    ComputerKey(#VK_LSHIFT)
    ComputerKey('W', #True)
    ComputerKey('W', #False)
    ComputerKey(#VK_LSHIFT, 0)
    
    ComputerKey(#VK_I)
    ComputerKey(#VK_I, 0)
    
    ComputerKey('N', 1)
    ComputerKey('N', 0)
    
    ComputerKey(#VK_D, 1)
    ComputerKey(#VK_D, 0)
    
    ComputerKey(#VK_O, 1)
    ComputerKey(#VK_O, 0)
    
    ComputerKey('W', 1)
    ComputerKey('W', 0)
    
    ComputerKey(#VK_S)
    ComputerKey(#VK_S, #False)
    
    ComputerKey(#VK_LSHIFT)
    ComputerKey('1', 1)
    ComputerKey('1', 0)
    ComputerKey(#VK_LSHIFT, 0)
    
  CompilerElseIf #PB_Compiler_OS = #PB_OS_MacOS
    
    ProgramID = RunProgram("Open", "/Applications/TextEdit.app", "")
    Delay(3000)
    
    ComputerMouse(100, 100, 2, 1)
    ComputerMouse(100, 100, 2, 0)
    
    ComputerKey(#VK_Shift, #True)
    ComputerKey(#VK_H, #True, #True)
    ComputerKey(#VK_A, #True)
    ComputerKey(#VK_L, #True)
    ComputerKey(#VK_L, #True)
    ComputerKey(#VK_O, #True)
    ComputerKey(#VK_Space, #True)
    ComputerKey(#VK_M, #True, #True)
    ComputerKey(#VK_A, #True)
    ComputerKey(#VK_C, #True)
    ComputerKey(#VK_Slash, #True) ;no German-Keyboardlayout
    ComputerKey(#VK_O, #True, #True)
    ComputerKey(#VK_S, #True, #True)
    
  CompilerEndIf
  
  UnuseModule Simulate
CompilerEndIf
(Wunschänderung)
Zuletzt geändert von ccode_new am 22.10.2019 22:58, insgesamt 3-mal geändert.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Einfaches Automate-Module

Beitrag von RSBasic »

Super, danke :allright:

Aber könntest du stattdessen nur englische Prozedurnamen verwenden? Deutsche und denglische Prozedurnamen finde ich nicht so schön.
Mein Vorschlag: SimulateMouseKey(), SimulateKeyboardKey() oder SendMouseKey(), SendKeyboardKey()
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Einfaches Automate-Module

Beitrag von Nino »

Ich find's auch ganz interessant. :-)
Aber was genau bewirkt in der Prozedur Taste() der Parameter Zeichenmodus?

Die Linux-Sondertasten-Konstanten würde ich in einen

Code: Alles auswählen

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
   ...
CompilerEndIf
Block einschließen.

Und der folgende Block

Code: Alles auswählen

  ImportC "-lX11"
    XOpenDisplay(*display)
    XCloseDisplay(*display)
    XDefaultScreen(*display)
    XStringToKeysym(string.p-utf8)
    XKeysymToString(keysym)
    XKeysymToKeycode(*display, keysym)
    XFlush(display)
  EndImport
 
  ImportC "-lXtst"
    XTestFakeKeyEvent(display, keycode, is_press, delay)
    XTestFakeButtonEvent(display, button, is_press, delay)
    XTestFakeMotionEvent(display, screen_number, x, y, delay)
  EndImport
ist doch auch nur für Linux gültig, oder nicht?


PB bietet eine geniale Möglichkeit, mit deren Hilfe man (aus dem Forum) in die IDE kopierten Code direkt ausprobieren und den selben Code trotzdem als allgemeine Include-Datei verwenden kann:
Den Demo-Teil des Codes einfach in

Code: Alles auswählen

CompilerIf #PB_Compiler_IsMainFile
   ...
CompilerEndIf
einschließen.
Antworten