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 IsPressed - Maus -/ Tastendrücke global abfragen ohne hooks (https://www.delphipraxis.net/135233-ispressed-maus-tastendruecke-global-abfragen-ohne-hooks.html)

eagle616 7. Jun 2009 10:52


IsPressed - Maus -/ Tastendrücke global abfragen ohne hooks
 
Hi

Ich wollte neulich mit meinem Programm abfragen, ob die linke Maustaste gedrückt wurde.
Nach etlichen Versuchen mit hooks, die 1. komplieziert waren und 2. nicht funktioniert haben habe ich eine Funktion in der user32.dll gefunden, die alles hat was ich brauchte, wenn man die Rückgabewerte richtig behandelt.
Hier will ich diese Funktion nun mal Vorführen, füe die denen es auch zu blöd, zu kompliziert und zu schreibintensiv ist Hooks zu verwenden.

Zuerst die Unit für die DLL:

Delphi-Quellcode:
unit DLLLoadUnit;

interface

function GetAsyncKeyState(key : Cardinal) : integer;

implementation

function GetAsyncKeyState(key : Cardinal) : integer;
external 'user32.dll';

end.
Und jetzt die Funktion zum Aufrufen und Verarbeiten des Results:

Delphi-Quellcode:
function IsPressed(key : Cardinal) : integer ;
var DLLResult: integer;
begin
  Result := 0;
  DLLResult := GetAsyncKeyState(key);
  If DLLResult And $8000 = $8000 Then Result := 1;
end;
In einer While Schleife beispielsweise kann man nun abfragen ob die linke Maustaste (VK_LBUTTON) gedrückt wurde.
Als Parameter können Virtual-Key Codes verwendet werden.
Der Klick oder Tastendruck wird trotzdem an der Stelle ausgeführt und nicht etwa verhindert.

Ich hoffe ich konnte jemandem helfen.

mfg
eagle

toms 7. Jun 2009 11:03

Re: IsPressed - Maus -/ Tastendrücke global abfragen ohne ho
 
Wozu die DLLLoadUni? GetAsyncKeyState ist doch schon in Windows.pas deklariert.

eagle616 7. Jun 2009 11:09

Re: IsPressed - Maus -/ Tastendrücke global abfragen ohne ho
 
K das wusste ich nicht aber das ist ja auch nicht das wichtigste

toms 7. Jun 2009 11:11

Re: IsPressed - Maus -/ Tastendrücke global abfragen ohne ho
 
Zitat:

Zitat von eagle616
Zuerst die Unit für die DLL:

Was meinst du damit? Warum für die DLL?

eagle616 7. Jun 2009 11:15

Re: IsPressed - Maus -/ Tastendrücke global abfragen ohne ho
 
Um die DLL zu laden. Ich mach das immer in extra-Units

igel457 7. Jun 2009 11:16

Re: IsPressed - Maus -/ Tastendrücke global abfragen ohne ho
 
Die IsPressed Funktion lässt sich auch um einiges verkürzen:
Delphi-Quellcode:
function IsPressed(key : Cardinal) : boolean;
begin
  result := (GetAsyncKeyState(key) and $8000) = $8000;
end;

Satty67 7. Jun 2009 11:29

Re: IsPressed - Maus -/ Tastendrücke global abfragen ohne ho
 
und was ist der Unterschied zu
Delphi-Quellcode:
uses
  Windows;

[...]

function IsPressed(Key : Integer) : ShortInt;
begin
  Result := GetAsyncKeyState(Key);
end;
Gibt doch auch 1 (oder True) aus, wenn entsprechende Taste gedrückt wird. Wie schon gesagt wurde, ist die Dll-Funktion ja schon in Delphi's Unit Windows importiert :gruebel:

eagle616 7. Jun 2009 11:31

Re: IsPressed - Maus -/ Tastendrücke global abfragen ohne ho
 
Das gibt aber auch dann 1 aus, wenn die Taste zwischen dem letzten Aufruf und diesem Aufruf gedrückt wurde.
Es gibt alse auch 1 aus wenn die funktion durch einen Buttonklick aufgerufen wurde


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:37 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