Sendinput (ascii or unicode) (x86 and x64)

Share your advanced PureBasic knowledge/code with the community.
Nico
Enthusiast
Enthusiast
Posts: 274
Joined: Sun Jan 11, 2004 11:34 am
Location: France

Sendinput (ascii or unicode) (x86 and x64)

Post by Nico »

Two procédures: Sendinput for send text and KeyCombi for send command

Original code by :
Michael Vogel And netmaestro : http://www.purebasic.fr/english/viewtopic.php?p=289971
and ebs : http://www.purebasic.fr/english/viewtopic.php?t=7115

Code: Select all

; Send Keys and control
; Original code by 
; Michael Vogel And netmaestro : http://www.purebasic.fr/english/viewtopic.php?p=289971
; and ebs : http://www.purebasic.fr/english/viewtopic.php?t=7115
#KEYEVENTF_UNICODE = 4

Procedure SendInput(Text.s)
  Protected j.l, k.l, wVk.l = 0
  Protected *char.UNICODE, Dim SendInputData.INPUT(0)
  Protected *TexteUnicode
  
  CompilerIf #PB_Compiler_Unicode = 1
    *TexteUnicode = @Text
  CompilerElse
    *TexteUnicode = AllocateMemory((Len(Text)*2) + 2)
    PokeS(*TexteUnicode, Text, Len(Text), #PB_Unicode)
  CompilerEndIf
  
  k = Len(Text) * 2
  
  If k
    ReDim SendInputData(k)
    
    For j=0 To k-2 Step 2
      
      *char = *TexteUnicode + j
      
      If *char\u = 0
        ; Sécurisation du code
        Break
      ElseIf *char\u = 13
        wVk = #VK_RETURN
      ElseIf *char\u = 9
        wVk = #VK_TAB
      Else
        wVk = 0       
      EndIf
      
      SendInputData(j)\type=#INPUT_KEYBOARD
      SendInputData(j)\ki\wVk=wVk
      SendInputData(j)\ki\dwExtraInfo = 0
      SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
      SendInputData(j)\ki\time = 0
      
      If wVk = 0
        SendInputData(j)\ki\wScan = *char\u
      EndIf
      
      SendInputData(j+1)\Type = #INPUT_KEYBOARD
      SendInputData(j+1)\ki\wVk = wVk
      SendInputData(j+1)\ki\dwExtraInfo = 0
      SendInputData(j+1)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP
      SendInputData(j+1)\ki\time = 0
      
      If wVk = 0
        SendInputData(j+1)\ki\wScan = *char\u
      EndIf
      
    Next j
    
    CompilerIf #PB_Compiler_Unicode <> 1
      FreeMemory(*TexteUnicode)
    CompilerEndIf
    
    SendInput_(j, SendInputData(0), SizeOf(INPUT))
  EndIf

EndProcedure

Procedure.l KeyCombi(Ctrl.l, Alt.l, Shift.l, WinKey.l, key.a)
  Protected Extended.l, Scan.l, Scancode.w, j.l=-1, Nb.l, Win.l
  Protected Dim SendInputData.INPUT(0)
  
  If MapVirtualKey_(key, 2) = 0  ;MAPVK_VK_TO_CHAR=2
    Extended.l = #KEYEVENTF_EXTENDEDKEY
    ; get scan code
    Scan.l = MapVirtualKey_(key, 0)  ;MAPVK_VK_TO_VSC=0
    Scancode.w=Scan & $FFFF
  Else
    Extended = 0
    Scancode = 0
  EndIf
  
  If WinKey
    Win = 1
  EndIf
  
  Nb=(Ctrl + Alt + Shift + Win)*2
  If Key
    Nb = Nb + 2
  EndIf 
  
  ReDim SendInputData.INPUT(Nb)
  
  If Ctrl 
    j=j+1     
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_CONTROL
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf 
  
  If Alt
    j=j+1   
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_MENU
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If Shift 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_SHIFT
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If WinKey = 1 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_LWIN
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If WinKey = 2 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_RWIN
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If Key 
    j=j+1  
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= Key
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|Extended
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = Scancode
    
    j=j+1
    SendInputData(j)\Type = #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk = Key
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP|Extended
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = Scancode
  EndIf 
  
  If Shift 
    j=j+1     
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_SHIFT
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If Alt 
    j=j+1     
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_MENU
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If Ctrl
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_CONTROL
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE|#KEYEVENTF_KEYUP
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf 
  
  If WinKey = 2 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_RWIN
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  If WinKey = 1 
    j=j+1      
    SendInputData(j)\type= #INPUT_KEYBOARD
    SendInputData(j)\ki\wVk= #VK_LWIN
    SendInputData(j)\ki\dwExtraInfo = 0
    SendInputData(j)\ki\dwFlags = #KEYEVENTF_UNICODE
    SendInputData(j)\ki\time = 0
    SendInputData(j)\ki\wScan = 0
  EndIf
  
  SendInput_(Nb, SendInputData(0), SizeOf(INPUT))
  
EndProcedure

RunProgram("notepad.exe")

Delay(3000)

SendInput("ùìò~iaallzertyââââääääêûîôÄËÜÏÖùò~âêûîôÿ¨Y¨Y^y"+Chr(13)+ "PureBasic" + Chr(9) + "is" + Chr(9) + "cool" + Chr(13))

Delay(1000)

; Paste the text
SetClipboardText("Simulate CTRL + V for paste this text")
Delay(1000)
keycombi(1, 0, 0, 0, #VK_V)
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5494
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Sendinput (ascii or unicode) (x86 and x64)

Post by Kwai chang caine »

Always usefull for remote other applications :wink:
Thanks for sharing 8)
ImageThe happiness is a road...
Not a destination
Post Reply