Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tastaursimulation + Windows.pas (https://www.delphipraxis.net/44595-tastaursimulation-windows-pas.html)

Harry M. 21. Apr 2005 11:29


Tastaursimulation + Windows.pas
 
das mein programm richtig geht, ist es für mich notwendig gewesen, die Windows.pas zu erweitern da die virtualkeys für a-z und 0-9 nicht enthalten waren. nachdem ich das jetzt getan habe und endlich über den aufruf
Delphi-Quellcode:
keybd_event(VK_A, MapVirtualKey(VK_A, 0), 0, 0)
ein 'a' an die anwendung geben kann stellst sich für mich die frage, wie mache ich das mit umlauten und grossbuchstaben und sonderzeichen?

und bitte nicht auf sendkey, sendkey32.pas, PostKeyEx, PostKeyEx32 usw. verweisen. das habe ich alles schon durch und nie wirklich das gewünschte ergebenis bekommen (in den letzten 3 tagen).
am besten davon ist die procedure PostKeyEx32 dahabe ich habe das problem einer "variablen verschiebung" wenn ich diese über den aufruf
Delphi-Quellcode:
{in TEMPSTR befindet sich zb. 'k'}
PostKeyEx32(Ord(TEMPSTR[1]), [], FALSE);
tue kommt am ende ein '+' bei der zeilanwendung an. vom '+' bis zum 'k' sind es nach ascii tabelle genau 32 zeichen. eine berechnung kann ich nicht machen, weil die tasten 1-9 ordnungsgemäss gehen. befindet sin in TEMPSTR ein 'a' kommt bei der zeilanwendung eine '1' an. von '1' bis 'a' sind es 52 zeichen bzw. bis 'A' wenn ich ssShift übergebe sind es 16 zeichen.

also das alles geht nicht. des halb will ich den entsprechen aufruf in einer case of unter bringen:
Delphi-Quellcode:
 case TEMPSTR[1] of
  //..
  #97: keybd_event(VK_A, MapVirtualKey(VK_A, 0), 0, 0)
  //..
  end;


gruß harry

Robert Marquardt 21. Apr 2005 13:20

Re: Tastaursimulation + Windows.pas
 
Das waere nicht noetig gewesen. Die VK_ Codes fuer 'A'..'Z' und '0'..'9' entsprechen dem ASCII-Wert. VK_A ist also Ord('A').

Nicht vergessen die Taste wieder loszulassen:
Delphi-Quellcode:
  keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0);
  keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0);
Jetzt mal ein 'a':
Delphi-Quellcode:
  keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), 0, 0);
  keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0);
  keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0);
  keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_KEYUP, 0);
Jetzt mal ein Alt-Tab:
Delphi-Quellcode:
  keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
  keybd_event(VK_TAB, MapVirtualKey(VK_TAB, 0), 0, 0);
  keybd_event(VK_TAB, MapVirtualKey(VK_TAB, 0), KEYEVENTF_KEYUP, 0);
  keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
Die Vermutung das es ein Ü ueberhaupt gibt ist natuerlich falsch.
Die Tastaturverarbeitung sollte man an den Scancodes aufhaengen und nicht an den VK_ Codes.
Die Tastatur liefert naemlich sprachunabhaengige Scancodes und die Umwandlung in lokalisierte Zeichen erfolgt mit ToAscii().
Die Umwandlung ist nicht trivial!

Harry M. 21. Apr 2005 13:39

Re: Tastaursimulation + Windows.pas
 
hallo robert,

es geht nicht!!! ich bekomme statt einem 'k' ein '+' und bei einem 'a' eine '1' geschrieben

Robert Marquardt 21. Apr 2005 14:14

Re: Tastaursimulation + Windows.pas
 
Poste doch mal den Code der zum '+' fuehrt.

Ein Test:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Buttons, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    SpeedButton1: TSpeedButton;
    procedure SpeedButton1Click(Sender: TObject);
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
  keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), 0, 0);
  keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), 0, 0);
  keybd_event(Ord('A'), MapVirtualKey(Ord('A'), 0), KEYEVENTF_KEYUP, 0);
  keybd_event(VK_SHIFT, MapVirtualKey(VK_SHIFT, 0), KEYEVENTF_KEYUP, 0);
end;

end.
Dieser generiert im Editfeld ein grosses A. Kommentiert man dir VK_SHIFT-Zeilen aus, so generiert es ein kleines a.
Die Vermutung es gaebe ein VK_a ist falsch. Die Vermutung Ord('A') erzeuge ein 'A' ist falsch.
Man muss hier beachten das die VK_-Konstanten die Taste einer US-Tastatur benennen. Tastaturen sind aber immer in Grossbuchstaben benannt.
Das Druecken einer Taste generiert aber keinen Grossbuchstaben sondern einen Kleinbuchstaben.

Zum Spass teste das Programm mit auskommentierten VK_SHIFT-Zeilen und CAPS LOCK aktiv. Du bekommst ein grosses A.

Harry M. 21. Apr 2005 14:26

Re: Tastaursimulation + Windows.pas
 
Delphi-Quellcode:
  TEMPSTR := 'k';
  keybd_event(Ord(TEMPSTR[1]), MapVirtualKey(Ord(TEMPSTR[1]), 0), 0, 0);
  keybd_event(Ord(TEMPSTR[1]), MapVirtualKey(Ord(TEMPSTR[1]), 0), KEYEVENTF_KEYUP, 0);
oder eben wie schon oben gepostet:
Delphi-Quellcode:
PostKeyEx32(Ord(TEMPSTR[1]), [], FALSE);
so wie du es gepostest hast geht es ja auch aber aber nur wenn ich es mi button habe und mit einer direkten letter angabe zb 'a'. ich brauche das so, wie ich es dargestellt habe. ich habe auch schon über die abfrage:

Delphi-Quellcode:
if TEMPSTR = 'k' then keybd_event(Ord('k'), MapVirtualKey(Ord('k'), 0), 0, 0);
es versucht. nix da kommt ein '+' ob du es glaubst oder nicht. ich kann dir ja mal den code via pn zustellen. ist auch nicht viel, weil ich dieses problem "ausserhalb der hauptanwendung" behandle.

ich bin mir zwar noch nicht ganz sicher aber wenn ich TEMPSTR als ascii-code behandele geht... aber ich bin mir noch nicht ganz sicher

Delphi-Quellcode:
  TASTE := StrToInt(TEMPSTR); //in TEMPSTR steht jetzt zb 65 für 'A'
  keybd_event(TASTE, MapVirtualKey(TASTE, 0), 0, 0);
  keybd_event(TASTE, MapVirtualKey(TASTE, 0), KEYEVENTF_KEYUP, 0);

Robert Marquardt 21. Apr 2005 15:10

Re: Tastaursimulation + Windows.pas
 
Lies doch nochmal meine Message durch (ich habe sie editiert).
Ein VK_k gibt es nicht. Der Fehler ist also der String 'k'. Ersetze ihn durch 'K'.

Harry M. 21. Apr 2005 15:19

Re: Tastaursimulation + Windows.pas
 
so weit geht das zwar dann aber spätesten beim '!' ist ende da kommt nix mehr... da muß ich dann den ascii wert abfragen und ggf shift nehmen so wie du es oben gezeigt hast??

Robert Marquardt 21. Apr 2005 15:22

Re: Tastaursimulation + Windows.pas
 
Aber natuerlich. Schau auf deine Tastatur da steht es drauf.
Loese dich von der Vorstellung das ASCII hier eine Rolle spielt.

Harry M. 21. Apr 2005 15:27

Re: Tastaursimulation + Windows.pas
 
in wie weit gehen dann die pfeil tasten und F1-F12 sowie die zeichen der drittbelegung @ € ~ \ usw ???

Robert Marquardt 21. Apr 2005 15:31

Re: Tastaursimulation + Windows.pas
 
Bitte lies dir mal die VK_ Codes durch.
Vergiss nicht das sich dies auf der Ebene der Tastatur abspielt.
Drittbelegungen sind also AltGr + Taste = Ctrl + Alt + Taste.
Was das Programm daraus macht ist dem Programm ueberlassen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:42 Uhr.
Seite 1 von 2  1 2      

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