Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Lazarus (IDE) (https://www.delphipraxis.net/81-lazarus-ide/)
-   -   Hotkey per Button (https://www.delphipraxis.net/196722-hotkey-per-button.html)

SaFu 12. Jun 2018 15:48

Hotkey per Button
 
Hi,

ich versuche einen USB-Switch per kleinen Tool umzuschalten, der Hotkey für den USB-Switch ist zweimal "Rollen" (Scroll) drücken. Das ganze später noch per Timer.

Nun habe ich folgendes geschrieben

Code:
const
  VK_SCROLL = 145; // SCROLL LOCK Taste

procedure TForm1.Button1Click(Sender: TObject);
begin
 Keybd_Event(VK_Scroll,0,0,0);
end;


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   if key = VK_Scroll then
     begin
      ShowMessage('gedrückt')
     end
     else
      ShowMessage('nix')
     end;
end;
Soweit wird in der Message alles richtig ausgegeben wenn der Button gedrückt wird, leider tut sich am Switch nix. Muss ich was anderes benutzen oder warum wird es nicht angenommen?

LG

Der schöne Günther 12. Jun 2018 15:57

AW: Hotkey per Button
 
Du erfindest dir selbst auf deinem PC einen künstlichen Tastendruck und fügst den in Windows ein. Da wird nichts über irgendwelche USB-Kabel gesendet.

himitsu 12. Jun 2018 15:58

AW: Hotkey per Button
 
Abgesehn davon, dass diese API überaltert ist.
siehe https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx

Kommt es halt darauf an, auf was der Treiber/Programm für diesen Hotkey reagiert.
Es gibt mehrere Ebenen, wo man senden/lesen kann.
Und wenn der Switch auf die Kommunikation "von" der Tastatur reagiert, dann ist es zu spät, wenn du es im PC erst einfügst.

Eventuell gibt es aber auch eine API, mit der du vom PC aus mit dem Switch reden kannst. (aber das hängt von dem Switch ab, den wir aus unerfindlichen Gründen nicht kennen)

SaFu 12. Jun 2018 16:19

AW: Hotkey per Button
 
Es ist ein ganz simpler USB Umschalter


2 Port USB 3.0-Umschalter LogiLink UA0216 Schwarz

Der auf die Tastatur reagiert.

LG

HolgerX 12. Jun 2018 16:26

AW: Hotkey per Button
 
Hm...


Zitat:

Zitat von SaFu (Beitrag 1404649)
Der auf die Tastatur reagiert.

Ich glaube, damit hat es sich erledigt, da der USB-Adapter die Tastendrücke direkt abgreift, also nicht über einen Windows-Hotkey.
Windows weiß garnichts vom 'Umschalter'..

himitsu 12. Jun 2018 16:30

AW: Hotkey per Button
 
Nja, im Datenblatt ist nichts zu finden und eine Anwendung/Programm gibt es auch nicht in den Downloads,
also vermutlich nichts zu machen, außer du hast eine teure Tastatur, der du den Befehl schiken kannst, dass sie den Tastencode sendet. (1)
http://www.logilink.eu/Produkte_Logi...Umschalter.htm


Ich hab einen kleinen Switch von DIGITUS und leider gibt es da auch nichts.

Ehrlich gesagt, hab ich noch keinen USB-3-Switch entdeckt, den man auch PC-seitig steuern kann. :cry:
k.A. warum man sowas nirgendwo eingebaut hat.
Es wäre auch zu toll, wenn der automatisch umschaltet, wenn nur noch ein PC aktiv ist. (mein Monitor macht das, aber nur halb, in die eine Richtung > DVI aus, HDMI an)



1) Bei PS/2 hätte man leicht über einen billigen Mikrocontroller am Tastaturstecker ein Signal einschleußen können.
Bliebe noch die Möglichkeit einen Mikrocontroller mit USB-Port zu nehmen, ihn mit einem USB-Hub neben die Tastatur zu hängen und dort drauf einen Tastatur-Stack zu installieren, also dass sich das Ding dann als Tastatur ausgibt. (da dann das, was ich oben mit der Tastatur sagte)

SaFu 12. Jun 2018 16:56

AW: Hotkey per Button
 
Schade, mein Traum ist somit geplatzt, hab gedacht ich wäre nah dran :lol:

Hab gedacht, wenn ich das Ding über Tastatur sowieso umschalten kann, dann kan man es auch Softwareseitig simulieren.

Danke trotzdem.

KodeZwerg 12. Jun 2018 18:19

AW: Hotkey per Button
 
Zitat:

Zitat von himitsu (Beitrag 1404653)
Ehrlich gesagt, hab ich noch keinen USB-3-Switch entdeckt, den man auch PC-seitig steuern kann.

Hier ist einer von vielen aber in freier Wildbahn selten bis gar nicht anzufinden :-)

Zum TE: Ich würde mir, falls Deine Tastatur so etwas kann, ein Makro aufzeichnen, viele Keyboard-Hersteller bieten dafür eine Api an das man auch außerhalb per Code das Makro über Tastatur ausführt was Deinen Switch zum switchen bringen sollte.

SaFu 13. Jun 2018 05:49

AW: Hotkey per Button
 
Wäre es mit so einer Tastatur möglich?
https://activekeyboards.eu/Programmm...f0915287feb0b6

KodeZwerg 13. Jun 2018 09:41

AW: Hotkey per Button
 
Ich weiß es nicht ob diese Tastatur so etwas kann und so leid es mir tut, ich lese mich bestimmt nicht in die Doku dafür rein aber was eventuell klappen könnte, jenseits von Delphi, wäre es HID macros: Software for sending keyboard macros activated from different USB devices da mal zu versuchen. Das geht ähnlich vor wie ich beschrieben habe, ob es zum Erfolg führt weiß ich nicht da ich nicht Deine Probleme habe. (soll nicht abwertend sein auch wenn es so klingt)

Ps: Delphi Source vom Programm ist auf GitHub vorhanden.

SaFu 13. Jun 2018 11:05

AW: Hotkey per Button
 
Danke schonmal für die Antworten,

Ich glaub ich hab da auch ein Verständnisproblem, wenn ich über die Windowseigen Bildschirmtastatur zwei mal auf Rollen drücke, schaltet der USB-Switch um.

Von meinem Verständnis her ist es ja auch nur eine Software (Bildschirmtastatur), also warum kann ich es auch nicht so machen?


LG

KodeZwerg 13. Jun 2018 11:11

AW: Hotkey per Button
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Keybd_Event(VK_Scroll,0,0,0);
end;
Versuche mal
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Keybd_Event(VK_Scroll,0,0,0); // <- taste drücken
 Keybd_Event(VK_Scroll,0,KEYEVENTF_KEYUP,0); // <- taste loslassen
 Keybd_Event(VK_Scroll,0,0,0); // <- taste drücken
 Keybd_Event(VK_Scroll,0,KEYEVENTF_KEYUP,0); // <- taste loslassen
end;

SaFu 13. Jun 2018 12:01

AW: Hotkey per Button
 
Also, wenn ich das so ausführe,

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
 Keybd_Event(VK_Scroll,0,0,0); // <- taste drücken
 Keybd_Event(VK_Scroll,0,KEYEVENTF_KEYUP,0); // <- taste loslassen
 Keybd_Event(VK_Scroll,0,0,0); // <- taste drücken
 Keybd_Event(VK_Scroll,0,KEYEVENTF_KEYUP,0); // <- taste loslassen
end;
Passiert bei Button nix,

Aber wenn ich es nochmal in das KeyDown Event reinschreibe und zwar so

Code:

procedure TForm1.Button1Click(Sender: TObject);
begin
  Keybd_Event(VK_Scroll,0,0,0); // <- taste drücken
  Keybd_Event(VK_Scroll,0,KEYEVENTF_KEYUP,0); // <- taste loslassen
  Keybd_Event(VK_Scroll,0,0,0); // <- taste drücken
  Keybd_Event(VK_Scroll,0,KEYEVENTF_KEYUP,0); // <- taste loslassen
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
   Keybd_Event(VK_Scroll,0,0,0); // <- taste drücken
   Keybd_Event(VK_Scroll,0,KEYEVENTF_KEYUP,0); // <- taste loslassen
end;
funktioniert es über den Button aber es hängt in einer Schleife. Somit sollt es ja irgendwie funktionieren.


LG

himitsu 13. Jun 2018 12:04

AW: Hotkey per Button
 
Zitat:

Zitat von SaFu (Beitrag 1404714)
Ich glaub ich hab da auch ein Verständnisproblem, wenn ich über die Windowseigen Bildschirmtastatur zwei mal auf Rollen drücke, schaltet der USB-Switch um.

Von meinem Verständnis her ist es ja auch nur eine Software (Bildschirmtastatur), also warum kann ich es auch nicht so machen?

Das ist etwas Anderes.
Es gibt ein paar Tastatur-States, die werden an die Tastatur gesendet und da kann dann auch wieder der Switch drauf reagieren, auf die Befehle an die Tastatur.
Hier muß ja der PC der Tastatur sagen "schalte deine Scroll-Lock-LED an", sonst zeigt die Tastatur-LED etwas anderes/falsches, als der Status im PC aussagt, wenn es von der virtuellen Tastatur kam.
(Scroll-Lock, Shift-Lock und Num-Lock)

Im Prinzip ist es einfach.
Der Switch reagiert nur auf Befehle, welche durch das USB-Kabel wandern.
SendInput und Dergleichen schleußen ihre Signale aber erst nach dem USB-Port in deinem PC ein.

Via Software kannst du dich aber nur an gewissen Stellen einmischen (dort deine virtuellen Tastatur-Events senden), also bei "<---"
und bei "<--- ?" nur, wenn du das Programm hookst, bzw. selber dort etwas dafür einkompiliers.
Alles davor nur über zusätzliche Hardware, oder wenn sich die vorhandene Hardware steuern ließe, also ein API für den Switch oder eben eine steuerbare Tastatur.
Code:
          Tastatur
             V
           Kabel
             V
         USB-Switch
             V
           Kabel
             V
          USB-Port
             V
        USB-Treiber
             V   <---
 LowLevel-Tastatur-Funktionen
             V   <---
HighLevel-Tastatur-Funktionen
             V   <---
      Windows-Messages
             V   <--- ?
Ereignisbehandlung im Programm
             V   <--- ?
  die Auswertung im Programm
Im Fall der Lock-LEDs ist das halt ein Steuerbefehl für die Tastatur durch das Kabel, auf welchen der Switch reagieren kann, wenn er auch den Rückkanal überwacht,
aber da ist das eben nicht direkt der Tastatur-Code von der Tastatur durch das Kabel, sondern eben die zugehörige LED, auf welche hier reagiert wird.

SaFu 13. Jun 2018 13:59

AW: Hotkey per Button
 
So funktioniert das ganze.

Code:
procedure TForm1.Button1Click(Sender: TObject);
var Count:integer;
begin
 for Count:= 1 to 2 do
  begin
    Windows.keybd_event(VK_Scroll, Windows.MapVirtualKey(VK_Scroll, 0), KEYEVENTF_EXTENDEDKEY, 0); // Scroll drücken
    Windows.keybd_event(VK_Scroll, Windows.MapVirtualKey(VK_Scroll, 0), KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); // Scroll loslassen
    sleep(200);
  end;
end;
Danke für die Hilfestellung.

KodeZwerg 13. Jun 2018 14:14

AW: Hotkey per Button
 
:thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz