Aktuelle Zeit: 23.02.2019 15:18

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.
Es wäre schön wenn es jemand für Mac erweitern könnte.

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
  CompilerEndIf
 
  Declare ComputerKey(key.i, is_press.b = 1, option.b = 0, char_mode.b = 0)
  Declare ComputerMouse(posx.i, posy.i, 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
  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)
     
      ;       If XKeySymToString(key) <> 0
      ;         Debug PeekS(XKeySymToString(key), -1, #PB_UTF8)
      ;       EndIf
      ;       symbol = XStringToKeysym(PeekS(XKeySymToString(key), -1, #PB_UTF8))
     
      code = XkeysymTokeycode(*display, key)
      XTestFakekeyEvent(*display, code, is_press, 0)
      XFlush(*display)
      XCloseDisplay(*display)
    CompilerEndIf
  EndProcedure
 
  Procedure ComputerMouse(posx.i, posy.i, key.w = 0, is_pressss.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)
    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("xed", "", "")
    Delay(3000)
   
    ;   ComputerMouse(100, 50, 0)
    ;   ComputerMouse(100, 50, 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)
   
    Ghost(" Its snowing", 20)
   
  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)
   
    Ghost(" Its snowing", 20)
   
  CompilerEndIf
 
  UnuseModule Simulate
CompilerEndIf


(Wunschänderung)


Zuletzt geändert von ccode_new am 09.01.2019 19:49, insgesamt 2-mal geändert.

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

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

_________________
BildBildBildBildBildBild


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 2 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