Seite 1 von 1

Taste betätigen am PC über Purebasic ?

Verfasst: 05.01.2019 11:42
von funkheld
Hallo, guten Tag.

Ich sende ein Seriell-Signal zum Purebasic und möchte bitte, das jetzt eine Taste am PC betätigt wird für ein anders Programm was läuft.Die seriellen Daten senden habe ich fertig.

Wie geht das bitte mit der Taste?

Danke.
Gruss

Re: Taste betätigen am PC über Purebasic ?

Verfasst: 05.01.2019 11:58
von ccode_new
Hallo funkheld,

wie sendest du das serielle Signal ?

Über COM-Port (USB/What ever)

Oder über Funk ?

Re: Taste betätigen am PC über Purebasic ?

Verfasst: 05.01.2019 12:16
von funkheld

Code: Alles auswählen

 If port > 0
    While AvailableSerialPortInput(port)  
      ReadSerialPortData(port, @r_byte, 1)
    Wend 
  EndIf  
Ich empfange Daten vom Comport1 mit 9600Baud.
Wenn hier in r_byte ein bestimmter Wert drin ist, den ich auswerte soll eine bestimmte Taste betätigt werden von Purebasic.

Danke.
Gruss

Re: Taste betätigen am PC über Purebasic ?

Verfasst: 05.01.2019 12:31
von ccode_new
Gut!

Also dann soll bei einem bestimmten empfangenen Wert eine bestimmte Taste simuliert werden. Richtig ?

Hierbei ist jetzt also nur dein Problem wie man eine\n Taste(ndruck) simulieren kann, oder ?

Suche mal nach "keybd_event" oder "Tasten simulieren", oder ähnlich hier im Forum.

Einfaches Beispiel:

Code: Alles auswählen

RunProgram("notepad.exe")
Delay(1000)
keybd_event_(#VK_A,0,0,0)
Dabei ist aber das größte Problem den fremden Eingabe-Fokus zu erlangen.

Oder wenn du einen fremden Button klicken möchtest wäre auch ein Simulieren eines Mausklicks sinnvoll.

Code: Alles auswählen

GetCursorPos_(xy.point)
mouse_event_(#MOUSEEVENTF_LEFTDOWN, xy\x,xy\y,0,0)
Hier einmal noch etwas komfortabler:

Code: Alles auswählen

Global TestMethode = 1

Procedure Taste(Taste.i, Gedrueckt.b = 1, Methode.b = 0, Zeichenmodus.b = 0)
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    If Methode = 0
      Protected TipTap.INPUT
      TipTap\Type = #INPUT_KEYBOARD
      If Gedrueckt = 1
        If Zeichenmodus = 1
          TipTap\ki\wScan = Taste
          TipTap\ki\dwFlags = 4
        Else
          TipTap\ki\wVk = Taste
          TipTap\ki\dwFlags = 0
        EndIf
      ElseIf Gedrueckt = 0
        If Zeichenmodus = 1
          TipTap\ki\wScan = Taste
          TipTap\ki\dwFlags = 4 | #KEYEVENTF_KEYUP
        Else
          TipTap\ki\wVk = Taste
          TipTap\ki\dwFlags = #KEYEVENTF_KEYUP
        EndIf
      EndIf
      SendInput_(1, @TipTap, SizeOf(INPUT))
    ElseIf Methode = 1
      If Gedrueckt = 1
        If Zeichenmodus = 1
          keybd_event_(0, Taste,  4, 0)
        Else
          keybd_event_(Taste, 0, 0, 0)
        EndIf
      Else
        If Zeichenmodus = 1
          keybd_event_(0, Taste, 4 | #KEYEVENTF_KEYUP, 0)
        Else
          keybd_event_(Taste, 0, #KEYEVENTF_KEYUP, 0)
        EndIf
      EndIf
    EndIf
  CompilerEndIf
EndProcedure

Procedure Maus(PosX.i, PosY.i, Taste.w = 0, Gedrueckt.b = 1, Methode.b = 0) ;Taste = 0 (Left) / Taste = 1 (Right) / Taste = 2 (Middle)
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    If Methode = 0
      Protected Miau.INPUT
      Miau\Type=#INPUT_MOUSE
      If Gedrueckt = 1
        If Taste = 0
          Miau\mi\dwFlags  = #MOUSEEVENTF_LEFTDOWN
        ElseIf Taste = 1
          Miau\mi\dwFlags  = #MOUSEEVENTF_RIGHTDOWN
        ElseIf Taste = 2
          Miau\mi\dwFlags  = #MOUSEEVENTF_MIDDLEDOWN
        EndIf
      Else
        If Taste = 0
          Miau\mi\dwFlags  = #MOUSEEVENTF_LEFTUP
        ElseIf Taste = 1
          Miau\mi\dwFlags  = #MOUSEEVENTF_RIGHTUP
        ElseIf Taste = 2
          Miau\mi\dwFlags  = #MOUSEEVENTF_MIDDLEUP
        EndIf
      EndIf
      SetCursorPos_(PosX, PosY)
      SendInput_(1, @Miau, SizeOf(INPUT))
    Else
      Protected MausSpielfeldBreite.i  = GetSystemMetrics_( #SM_CXSCREEN )-1
      Protected MausSpielfeldHoehe.i  = GetSystemMetrics_( #SM_CYSCREEN )-1
      Protected mx.i = PosX * (65535 / MausSpielfeldBreite)
      Protected my.i = PosY * (65535 / MausSpielfeldHoehe)
      If Gedrueckt = 1
        If Taste = 0
          mouse_event_(#MOUSEEVENTF_LEFTDOWN | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
        ElseIf Taste = 1
          mouse_event_(#MOUSEEVENTF_RIGHTDOWN | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
        ElseIf Taste = 2
          mouse_event_(#MOUSEEVENTF_MIDDLEDOWN | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
        EndIf
      Else
        If Taste = 0
          mouse_event_(#MOUSEEVENTF_LEFTUP | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
        ElseIf Taste = 1
          mouse_event_(#MOUSEEVENTF_RIGHTUP | #MOUSEEVENTF_MOVE  | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
        ElseIf Taste = 2
          mouse_event_(#MOUSEEVENTF_MIDDLEUP | #MOUSEEVENTF_MOVE | #MOUSEEVENTF_ABSOLUTE, mx, my, 0, 0)
        EndIf
      EndIf
    EndIf
  CompilerEndIf
EndProcedure

RunProgram("notepad.exe")
Delay(3000)
; If TestMethode = 1
;   Maus(100, 100, 0, #True, #True)
;   Maus(100, 100, 0, #False, #True)
; Else
;   Maus(100, 100, 0, #True)
;   Maus(100, 100, 0, #False)
; EndIf
For i = 1 To 10
  If TestMethode = 1
    Taste(#VK_LSHIFT, #True, #True)
    Taste('R', #True, #True, #True)
    Taste(#VK_LSHIFT, #False, #True)
    Taste('R', #False, #True, #True)
    Taste('a', #True, #True, #True)
    Taste('a', #False, #True, #True)
  Else
    Taste('R', #True, #False, #True)
    Taste(#VK_A, #True, #False)
  EndIf
Next i

Re: Taste betätigen am PC über Purebasic ?

Verfasst: 07.01.2019 15:35
von funkheld
Hallo, danke für die Hilfe.

Gruss

Re: Taste betätigen am PC über Purebasic ?

Verfasst: 14.02.2019 16:55
von funkheld
Hallo, danke für die Hilfe.

Gruss

Re: Taste betätigen am PC über Purebasic ?

Verfasst: 14.02.2019 17:34
von RSBasic
Hast du vergessen, dass du genau das gleiche am 07.01. geschrieben hast? :) Oder bist du ein Bot? :D