Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Probleme mit virtual keys (https://www.delphipraxis.net/9036-probleme-mit-virtual-keys.html)

Wotan 17. Sep 2003 09:58


Probleme mit virtual keys
 
morgen alle zusammen,

ich sende virtuelle tasten an ein dos-programm unter win98 (ibm thinkpad). klappt prima mit keyb_event(.....)

leider funktioniert es nicht mehr auf einem anderen rechner (toshiba tecra 8000), bei dem ebenfalls win98 installiert ist.
Enter funktioniert, aber nicht die pfeiltasten.

kennt jemand den grund ??

gruß wotan

Robert Marquardt 17. Sep 2003 11:14

Re: Probleme mit virtual keys
 
Da kann ich dir ein traurig Lied singen.
Setz mal das EXTENDED Bit.
Die separaten Pfeiltasten und die Pfeiltasten auf dem Nummernblock unterscheiden sich durch dieses Bit. Was die Notebooktasten liefern steht in den Sternen.

Wotan 17. Sep 2003 12:57

Probleme mit virtual keys
 
Wie mache ich das ? Nutze den folgenden Code:

keybd_event(VK_return, MapVirtualKey(VK_shift, 0), 0, 0);

Robert Marquardt 17. Sep 2003 13:12

Re: Probleme mit virtual keys
 
Hier mal die Funktion mit allen Extras aus einem meiner Projekte.
Eine der Besonderheiten ist es, das die Funktion die Ziffernblocktasten auf die gewoehnlichen Tasten mappen kann. Einige Spiele kommen nicht mit allen Tasten zurecht.
Fuer dich ist wohl nur der Bereich von KEYEVENTF_EXTENDEDKEY interessant.

Delphi-Quellcode:
procedure StdKeyEvent(wScan: Word; dwFlags, dwExtraInfo: DWORD; Wait: Cardinal; NoNumPad: Boolean);
var
  Vk: Word;
begin
  if NoNumPad and ((wScan and $FF) in [$1C, $47, $48, $49, $4B, $4D, $4F, $50, $51, $52, $53]) then
    wScan := wScan and $FEFF;
  Vk := MapVirtualKey(wScan, 3);
  if Vk = 0 then
    Vk := MapVirtualKey(wScan, 1);
  if NoNumPad and ((wScan and $1FF) = $135) then
  begin
    Vk := VK_DIVIDE;
    wScan := MapVirtualKey(Vk, 0);
  end
  else
  if (Windows.GetKeyState(VK_NUMLOCK) and $1) <> 0 then
    case wScan and $FF of
      $47: begin Vk := Ord('7'); wScan := MapVirtualKey(Vk, 0); end;
      $48: begin Vk := Ord('8'); wScan := MapVirtualKey(Vk, 0); end;
      $49: begin Vk := Ord('9'); wScan := MapVirtualKey(Vk, 0); end;
      $4B: begin Vk := Ord('4'); wScan := MapVirtualKey(Vk, 0); end;
      $4C: begin Vk := Ord('5'); wScan := MapVirtualKey(Vk, 0); end;
      $4D: begin Vk := Ord('6'); wScan := MapVirtualKey(Vk, 0); end;
      $4F: begin Vk := Ord('1'); wScan := MapVirtualKey(Vk, 0); end;
      $50: begin Vk := Ord('2'); wScan := MapVirtualKey(Vk, 0); end;
      $51: begin Vk := Ord('3'); wScan := MapVirtualKey(Vk, 0); end;
      $52: begin Vk := Ord('0'); wScan := MapVirtualKey(Vk, 0); end;
      $53: begin Vk := VK_DECIMAL; wScan := MapVirtualKey(Vk, 0); end;
    end;
  if (wScan and $100) <> 0 then
  begin
    dwFlags := dwFlags or KEYEVENTF_EXTENDEDKEY;
    wScan := wScan and $FEFF;
  end;
  keybd_event(Vk, wScan, dwFlags, dwExtraInfo);
  if Wait > 0 then
    Sleep(Wait);
end;
[edit=Luckie]D-Tags hinzugefügt, folge Posting gelöscht. Mfg, Luckie[/edit]

Wotan 17. Sep 2003 13:23

Probleme mit virtual keys
 
Das schaut ja schon sehr gut aus. Könntest du mir ein Beispiel geben, wie ich die Funktion für die normalen Pfeiltasten aufrufe !?

Gruß Wotan

Dannyboy 17. Sep 2003 13:34

Re: Probleme mit virtual keys
 
Servus Wotan,
dafür nimmst Du das Beispiel mit diesen Api-Konstanten als Parameter:

VK_UP,
VK_DOWN,
VK_LEFT,
VK_RIGHT

Gruß Dannyboy

Wotan 17. Sep 2003 13:44

Re: Probleme mit virtual keys
 
hi dannyboy,

das ist mir schon klar.

die frage ist, was ich für dwFlags und dwExtraInfo setzen muß !?

Robert Marquardt 17. Sep 2003 14:48

Re: Probleme mit virtual keys
 
dwFlags kommt rein mit entweder KEYEVENTF_KEYDOWN oder KEYEVENTF_KEYUP.

dwExtraInfo ist egal. Den Wert kannst du im Programm das letztendlich eine WM_KEYDOWN oder WM_KEYUP Message bekommt, abrufen. Damit koenntest du dann unterscheiden woher der Tastenevent kommt. Leider markieren alle Treiber mit 0.

Wotan 17. Sep 2003 15:16

Re: Probleme mit virtual keys
 
hi robert,

es hat leider nicht geklappt.

kann es sein, daß man die einstellungen für die verknüpfungen der dos-programme irgendwie anpassen muß oder daß die win98 versionen verschieden sind !???


ich weiß nicht weiter. :coder:

gruß wotan

Robert Marquardt 18. Sep 2003 06:36

Re: Probleme mit virtual keys
 
Was willst du denn eigentlich generieren?
Hotkeys? Die koennten durchs Raster fallen, da sie moeglicherweise auf der Ebene unter keybd_event abgehandelt werden. Ctrl-Alt-Del z. B. wird tief im Treiber abgehandelt.

Wotan 18. Sep 2003 09:00

Re: Probleme mit virtual keys
 
Ich wollte an ein dos-programm folgende Tasten senden:

Enter
E
NachUnten
Enter
....

hat auf einem rechner prima funktioniert. als ich es dann auch auf einem anderen rechner laufen lassen wollte, haben die pfeiltasten nicht mehr funktioniert.

Robert Marquardt 18. Sep 2003 09:23

Re: Probleme mit virtual keys
 
Eigentlich sollte das entweder mit KEYEVENTF_EXTENDEDKEY oder ohne funktionieren. Zeig doch mal deinen Code.
Bei Notebooks besteht aber immer eine gewisse Chance das ein spezieller Treiber (z. B. fuer Spezialtasten) dazwischenpfuscht.

Wotan 18. Sep 2003 10:23

Re: Probleme mit virtual keys
 
Hier ist ein Auszug aus meinem Prog.

....
if form6.listbox1.Items.Strings[x]='Enter' then
Begin
keybd_event(VK_return, MapVirtualKey(VK_return, 0), 0, 0);
keybd_event(VK_return, MapVirtualKey(VK_return, 0),KEYEVENTF_KEYUP,0);
End else
if form6.listbox1.Items.Strings[x]='Hoch' then
Begin
keybd_event(VK_down, MapVirtualKey(VK_up, 0), 0, 0);
keybd_event(VK_down, MapVirtualKey(VK_up, 0), KEYEVENTF_KEYUP, 0);
End else
if form6.listbox1.Items.Strings[x]='Runter' then
Begin
keybd_event(VK_down, MapVirtualKey(VK_down, 0), 0, 0);
keybd_event(VK_down, MapVirtualKey(VK_down, 0), KEYEVENTF_KEYUP, 0);
End else
if form6.listbox1.Items.Strings[x]='Links' then
Begin
keybd_event(VK_down, MapVirtualKey(VK_left, 0), 0, 0);
keybd_event(VK_down, MapVirtualKey(VK_left, 0), KEYEVENTF_KEYUP, 0);
End else
if form6.listbox1.Items.Strings[x]='Rechts' then
Begin
keybd_event(VK_down, MapVirtualKey(VK_right, 0), 0, 0);
keybd_event(VK_down, MapVirtualKey(VK_right, 0), KEYEVENTF_KEYUP, 0);
End else
....

Wie gesagt, läuft auf dem einen Rechner prima und auf dem anderen nicht.

Robert Marquardt 18. Sep 2003 10:54

Re: Probleme mit virtual keys
 
Erst mal den Fehler beheben. Innerhalb der Aufrufe ueberall den gleichen VK_ Code angeben.

keybd_event(VK_down, MapVirtualKey(VK_down, 0), 0, 0);
keybd_event(VK_down, MapVirtualKey(VK_down, 0), KEYEVENTF_KEYUP, 0);

Wenn das nicht hilft dann mal mit KEYEVENTF_EXTENDEDKEY.

keybd_event(VK_down, MapVirtualKey(VK_down, 0), KEYEVENTF_KEYDOWN or KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_down, MapVirtualKey(VK_down, 0), KEYEVENTF_KEYUP or KEYEVENTF_EXTENDEDKEY, 0);

Es kann gut sein das es dann auf dem anderen aber nicht mehr auf dem einen Rechner geht.

Wotan 18. Sep 2003 12:16

Re: Probleme mit virtual keys
 
Hi Robert,

stimmt. ich hatte da teilweise die falschen vk_ codes drin.
aber beim vk_down ('runter') hat's ja gestimmt und nicht funktioniert.

ich werde jetzt mal die andere lösung von dir ausprobieren.

gruß wotan


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 Uhr.

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