[gelöst] Tastenkombination WIN+H

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
juelin
Beiträge: 270
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

[gelöst] Tastenkombination WIN+H

Beitrag von juelin »

Hallo,
ich möchte in meinem Programm (unter Windows 11) die Tastenkombination WIN+H ausgeben.
Dazu benutze ich folgende Procedure

Code: Alles auswählen

procedure TForm1.EnterText(AText: String);
  var
    lCount: Integer;
    lScanCode: Smallint;
begin
  for lCount:=1 To Length(AText) Do
  begin
    lScanCode:=VkKeyScan(AText[lCount]);
    keybd_event(lScanCode, 0, 0, 0);
    keybd_event(lScanCode, 0, KEYEVENTF_KEYUP, 0);
  end;
end;
Aufruf: EnterText(Char(VK_LWIN)+Char(VK_H));
Das klappt natürlich nicht, da ich nicht weiss wie die Tastencodes für WIN+H sind.
Habe dann eine Konsolanwendung mit Uses CRT und ReadKey geschrieben um die Tastenkombination
raus zu kriegen.
Aber bei Betätigung von WIN+H reagiert der ReadKey gar nicht.
Kann mir da jemand einen Tipp geben, wie ich WIN+H aus dem Programm auslöse?
Danke und einen schönen Tag
Jürgen
Zuletzt geändert von juelin am Mo 19. Mai 2025, 11:31, insgesamt 1-mal geändert.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 375
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Tastenkombination WIN+H

Beitrag von Jorg3000 »

Hi again!
Man kann unter Windows eine Folge von Tasten-Ereignissen feuern ...

Code: Alles auswählen

 
uses Windows;

procedure pressWinH();
var
  Inputs: Array[0..3] of Windows.TInput;
begin
  // Win-Taste runter
  Inputs[0]._Type := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_LWIN;
  Inputs[0].ki.dwFlags := 0;

  // H-Taste runter
  Inputs[1]._Type := INPUT_KEYBOARD;
  Inputs[1].ki.wVk := Ord('H');
  Inputs[1].ki.dwFlags := 0;

  // H-Taste hoch
  Inputs[2]._Type := INPUT_KEYBOARD;
  Inputs[2].ki.wVk := Ord('H');
  Inputs[2].ki.dwFlags := KEYEVENTF_KEYUP;

  // Win-Taste hoch
  Inputs[3]._Type := INPUT_KEYBOARD;
  Inputs[3].ki.wVk := VK_LWIN;
  Inputs[3].ki.dwFlags := KEYEVENTF_KEYUP;

  // alle senden
  Windows.SendInput(4, @Inputs[0], SizeOf(TInput));
end;
 
Wenn man pressWinH() z.B. in einem TForm1.Button1Click() aufruft, erhält der Button den Fokus. Dann mahnt die Diktat-Funktion, dass man ein Eingabefeld auswählen soll. Deshalb in dem ButtonClick als erstes z.B. Edit1.SetFocus() setzen bevor pressWinH() aufgerufen wird, damit das Diktat ohne weitere Benutzereingriffe startet.
Grüße, Jörg

Benutzeravatar
juelin
Beiträge: 270
Registriert: Sa 24. Jul 2021, 18:03
OS, Lazarus, FPC: Linux Ubuntu 22. Windows 10 Delphi 11.3 (L 0.9.xy FPC 2.2.z)
CPU-Target: 64Bit
Wohnort: Mannheim

Re: Tastenkombination WIN+H

Beitrag von juelin »

Danke Jörg3000.
Du hast mir gut geholfen.
Gruß
Jürgen

Benutzeravatar
theo
Beiträge: 10897
Registriert: Mo 11. Sep 2006, 19:01

Re: [gelöst] Tastenkombination WIN+H

Beitrag von theo »

Kleine Klugscheißerei am Rande:
Eleganter als Ord('H') wäre VK_H, da die entsprechende Unit schon eingebunden ist.
Kommt aber hier auf das selbe raus.

Antworten