PureBoard
http://forums.purebasic.com/german/

Einfaches Automate-Module
http://forums.purebasic.com/german/viewtopic.php?f=8&t=31246
Seite 1 von 1

Autor:  ccode_new [ 06.01.2019 14:43 ]
Betreff des Beitrags:  Einfaches Automate-Module

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:
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)

Autor:  RSBasic [ 07.01.2019 10:46 ]
Betreff des Beitrags:  Re: Einfaches Automate-Module

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()

Autor:  Nino [ 07.01.2019 15:13 ]
Betreff des Beitrags:  Re: Einfaches Automate-Module

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:
CompilerIf #PB_Compiler_OS = #PB_OS_Linux
   ...
CompilerEndIf
Block einschließen.

Und der folgende Block
Code:
  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:
CompilerIf #PB_Compiler_IsMainFile
   ...
CompilerEndIf
einschließen.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/