Aktuelle Zeit: 03.06.2020 22:12

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Einfaches Automate-Module
BeitragVerfasst: 06.01.2019 14:43 
Offline

Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge
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)

_________________
Betriebssysteme: MX Linux 19 / Windows 10 / Mac OS 10.15.2 / Android 7.0 ;)


Zuletzt geändert von ccode_new am 22.10.2019 22:58, insgesamt 3-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Einfaches Automate-Module
BeitragVerfasst: 07.01.2019 10:46 
Offline
Admin
Benutzeravatar

Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
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()

_________________
BildBildBildBild BildBild


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Einfaches Automate-Module
BeitragVerfasst: 07.01.2019 15:13 
Offline

Registriert: 13.05.2010 09:26
Wohnort: Berlin
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.

_________________
Dieser Satz ist falsch.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 15 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye