AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Tastendrücke simuliern, abhängig von Betriebssystemversion?
Thema durchsuchen
Ansicht
Themen-Optionen

Tastendrücke simuliern, abhängig von Betriebssystemversion?

Ein Thema von PeterPanino · begonnen am 11. Jun 2006 · letzter Beitrag vom 11. Jun 2006
Antwort Antwort
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#1

Tastendrücke simuliern, abhängig von Betriebssystemversion?

  Alt 11. Jun 2006, 16:35
Ich verwende folgenden Code, um eine Zeichenfolge zu senden:

Delphi-Quellcode:
for i := 1 to Length(S) do
begin
  bUpCase := (S[i] in ['A'..'Z']);
  if bUpCase then
    keybd_event(VK_SHIFT, 0, 0, 0); //press (Umschalt-Taste)
  keybd_event(Ord(UpCase(S[i])), 0, 0, 0); //press (Zeichentaste)
  keybd_event(Ord(UpCase(S[i])), 0, KEYEVENTF_KEYUP, 0); //release (Zeichentaste)
  if bUpCase then
    keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); //release (Umschalt-Taste)
end;
Die Delphi 2006 Hilfe behauptet:

"Windows NT/2000/XP: This function has been superseded. Use SendInput instead."

Trotzdem funktioniert dieser Code in Windows XP. Ist es ratsam, zwischen Betriebssystem-Versionen zu unterscheiden und in Windows NT/2000/XP stattdessen SendInput zu verwenden?
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Tastendrücke simuliern, abhängig von Betriebssystemversi

  Alt 11. Jun 2006, 16:46
der Hinweis bedeutet das die Funktion in absehbarer Zukunft nicht mehr existiert. Also solltest du so weit möglich die neue Version verwenden. Da die neue Version bei alten Betriebssystemen noch nicht funktioniert bleibt somit nix anderes übrig als nach Betriebssystem zu unterscheiden welche Funktion genutzt werden soll (oder das Risiko eingehen das die Funktion beim nächsten Betriebssystem nicht mehr existiert und somit auch das Programm nicht mehr funktioniert)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Tastendrücke simuliern, abhängig von Betriebssystemversi

  Alt 11. Jun 2006, 18:23
Zitat von SirThornberry:
der Hinweis bedeutet das die Funktion in absehbarer Zukunft nicht mehr existiert. Also solltest du so weit möglich die neue Version verwenden. Da die neue Version bei alten Betriebssystemen noch nicht funktioniert bleibt somit nix anderes übrig als nach Betriebssystem zu unterscheiden welche Funktion genutzt werden soll (oder das Risiko eingehen das die Funktion beim nächsten Betriebssystem nicht mehr existiert und somit auch das Programm nicht mehr funktioniert)
Ja, ist wohl besser so.

Übrigens: Ich habe gemerkt, dass der obige Code bei Umlauten nicht funktioniert. Wie lauten denn die virtuellen Tastencodes für die Umlautzeichen-Tasten Ö, Ä, Ü sowie ß? In Windows.pas sind sie anscheinend nicht definiert.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

Re: Tastendrücke simuliern, abhängig von Betriebssystemversi

  Alt 11. Jun 2006, 19:00
Also ich kann SirThornberry nicht zustimmen!

Wäre die Funktion überholt und flöge sie bald raus, wäre der Status "deprecated" und nicht der den du oben beschrieben hast. "Superseded" bedeutet ja noch nichtmal ersetzt ("replaced") sondern nur, daß es eine Funktion gibt, die noch mehr kann als die einzelne Funktion keybd_event() welche du gerade benutzt. In diesem Fall bedeutet es, daß du die bei keybd_event() vorhandene Funktionalität und noch mehr (nämlich Mauseingaben und sogar mehrere Eingaben auf einmal) mit SendInput() erreichen kannst.

Wenn du dir MSDN-Library durchsuchenSendInput nun richtig angeschaut hättest, hättest du deine Frage in Sachen Umlaute schon beantwortet gefunden (unter KEYBDINPUT):
Zitat:
wVk
Specifies a virtual-key code. The code must be a value in the range 1 to 254. The Winuser.h header file provides macro definitions (VK_*) for each value. If the dwFlags member specifies KEYEVENTF_UNICODE, wVk must be 0.
wScan
Specifies a hardware scan code for the key. If dwFlags specifies KEYEVENTF_UNICODE, wScan specifies a Unicode character which is to be sent to the foreground application.
... denn mit MSDN-Library durchsuchenkeybd_event kannst du keine Unicode-Zeichen erzeugen (außer die sind in die aktuelle Codepage gemappt), bei MSDN-Library durchsuchenSendInput wird diese Funktionalität mitgeliefert.

MSDN-Library durchsuchenWinExec wäre ein Beispiel für den Status "deprecated" (Zitat: Note This function is provided only for compatibility with 16-bit Windows.)! So ziemlich alle Nur-Win16-Funktionen zählen dazu, auch wenn bei ihnen inzwischen nicht mehr "deprecated" steht, was IMO zwischenzeitlich mal der Fall war ...

Mehr: MSDN-Library durchsuchenSHChangeNotification_Lock, MSDN-Library durchsuchenSHGetShellStyleHInstance ...
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Tastendrücke simuliern, abhängig von Betriebssystemversi

  Alt 11. Jun 2006, 19:03
oh, ich sollte wohl an meinem englisch arbeiten
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Tastendrücke simuliern, abhängig von Betriebssystemversi

  Alt 11. Jun 2006, 19:30
@ Olli:

Vielen Dank für die kompetente Antwort! Leider kann ich SendInput nicht verwenden, da die Funktionalität auch unter Windows 98 gegeben sein muss. Wie kann man also die in der CodePage gemappten VirtualKeyCodes für die Umlaut-Tasten auslesen?

Sind eigentlich die VirtualKeyCodes für die Umlaut-Tasten auf allen Tastaturen mit deutschem Tastatur-Layout gleich? Oder wie kann man die sonst auf dem jeweiligen Laufzeitsystem auslesen?

Vielen Dank im Voraus!
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#7

Re: Tastendrücke simuliern, abhängig von Betriebssystemversi

  Alt 11. Jun 2006, 20:45
Also soweit ich mich entsinne, kann man die Sprache systemweit, hingegen die Codepage nur gerätekontextweit setzen. Für dich bedeutet das, daß du theoretisch statt Scancodes den Zeichencode 'ä' usw. hartkodieren kannst, daß dann aber in dem anderen Programm ggf. nicht 'ä' usw., sondern etwas komplett anderes angezeigt wird. Hat bspw. der Benutzer eine russische Codepage, kommt bei 'ä' mit großer Wahrscheinlichkeit ein 'д' raus (russisches D).
  Mit Zitat antworten Zitat
PeterPanino

Registriert seit: 4. Sep 2004
1.451 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Tastendrücke simuliern, abhängig von Betriebssystemversi

  Alt 11. Jun 2006, 21:47
Ich habe empirisch folgende virtuelle Tastencodes für nicht-englische Zeichen-Tasten gefunden (Tastatur: Logitech MX5000, Windows XP Home; Eingabegebietsschema: Deutsch; deutsches Tastaturlayout):

Delphi-Quellcode:
ü $BA
+ $BB (Umschalttaste: *)
, $BC (Umschalttaste: ;)
- $BD (Umschalttaste: _)
. $BE (Umschalttaste: :)
# $BF (Umschalttaste: ')
ö $C0
ß $DB (Umschalttaste: ?)
^ $DC
´ $DD
ä $DE
In KLammern stehen die jeweils mit der Umschalttaste auf dieser Tastatur erreichbaren Zeichen.

Kann man davon ausgehen, dass diese virtuellen Tastencodes auf allen deutschen Systemen zutreffend sind?

Könnte das mal jemand bei sich überprüfen?

Vielen Dank!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 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