Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi GetAsyncKeyState (https://www.delphipraxis.net/75515-getasynckeystate.html)

Nisbo 20. Aug 2006 20:03


GetAsyncKeyState
 
neue Frage neues Thema :D

Geht im Endeffekt um dieses Programm

ich möchte mittels GetAsyncKeyState die Kombination ALT + S abfangen so wie ich es bei dem Link schon mit F10 mache
das ganze schaut so aus

Delphi-Quellcode:
if GetAsyncKeyState(VK_LMENU) < 0 then
nur um mal die ALT-Taste abzufragen, allerdings geht schon das nicht, wen ich dann die alt-taste drücke wechslet Windows die fenster durch, also alle offenen programme werden pro klick der reihe nach durchgegangen

das nächste Problem ist das ich auch S prüfen möchte VK_S geht da aber leider nicht, kennt delphi nicht und ein drücken von F1 hilt auch nicht weiter

Also wie prüfe ich ob ALT + S gedrückt wird ?

SirThornberry 20. Aug 2006 20:08

Re: GetAsyncKeyState
 
schau dir mal die Hilfe zu GetAsyncKeyState an. Da steht auch wie die prüfst ob eine Taste gedrückt ist oder nicht.
Zitat:

...If the most significant bit is set, the key is down,...
daraus folgt
Delphi-Quellcode:
if (GetAsyncKeyState(VK_MENU) and 1 <> 0) then
  ShowMessage('Key is down')
else
  ShowMessage('Key is up');

Mackhack 20. Aug 2006 20:10

Re: GetAsyncKeyState
 
S hat den ASCII-Wert 115 (s) und 83 (S) falls dir das hilft!

3_of_8 20. Aug 2006 20:21

Re: GetAsyncKeyState
 
Der ASCII-Wert ist irrelevant, er braucht den virtuellen Tastencode, und das ist Ord('S')=83.

Der ASCII-Wert wird erst später gebildet.

BTW: Bei mir wechselt Windows nicht bei ALT zu, sondern bei ALT+TAB.

Achja und übrigens: Wenn das höchste Bit gesetzt ist, dann ist das Ergebnis von GetAsyncKeyState IMMER <0, daher ist das schon richtig.

Nisbo 20. Aug 2006 21:30

Re: GetAsyncKeyState
 
Delphi-Quellcode:
if (GetAsyncKeyState(VK_MENU) and 1 <> 0) then
bewirkt leider nicht das ausführen des programms, wird nur der eintrag in der menüliste blau hinterlegt

3_of_8 20. Aug 2006 21:56

Re: GetAsyncKeyState
 
Natürlich nicht.

Wenn die Taste gedrückt ist, steht in GetAsyncKeyState:

10000000 00000000

Und dann machst du and 1? Mach halt einfach <0, dann passt das.

Oder gleich:

if GetAsyncKeyState(myKey)=low(SmallInt) then...

Nisbo 20. Aug 2006 22:05

Re: GetAsyncKeyState
 
das war nicht mein code sondern der tipp etwas weiter oben ;)

Delphi-Quellcode:
if GetAsyncKeyState(VK_LMENU) < 0 then
hatte ich ja bereits im ersten posting erwähnt das dies nicht funktioniert wie es soll

ziel ist es das das funktioniert:
Delphi-Quellcode:
if (GetAsyncKeyState(VK_LMENU) < 0) and (GetAsyncKeyState(Ord('S')) < 0) then
was dementsprechnd ja auch nicht funktioniert, GetAsyncKeyState(Ord('S') einzeln funktioniert hingegen, nur die ALT-taste nicht die macht das was ich oben beschrieben habe

SirThornberry 20. Aug 2006 22:11

Re: GetAsyncKeyState
 
hast du mal meine Antwort gelesen?!

DGL-luke 20. Aug 2006 22:15

Re: GetAsyncKeyState
 
öhm... du willst den key "abfangen".

Heisst das auch "unterdrücken"?

Und im übrigen passt GetAsyncKeyState ( ja, <0 stimmt) so gar nicht zum event-driven model.... fang lieber OnKeyDown ab. falls das genau das ist, was du tust:

Delphi-Quellcode:
procedure TForm1.OnKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_S) and ((GetAsyncKeyState(VK_MENU) < 0) or (ssAlt in Shift)) then //man beachte das or!
    ShowMessage('Alt+S gedrückt!');
end;
Solls so sein? oder bist du in einem loop?

Zeig mal ein bisschem mehr Code.

@SirT: Irrelevant. <0 geht auch.

Nisbo 20. Aug 2006 22:29

Re: GetAsyncKeyState
 
@ SirThornberry

ja und probiert und wurde wegen dem Code von 3_of_8 zurechtgewiesen das dies falsch sein ;)

@ DGL-luke

OnKeyDown wird mir nichts bringen, das programm arbeitet im hintergrund im systray und sol systemweit (eigendlich nur im Opera) ALT + S abfangen, mehr code gibts im link im ersten posting, oder hier

Delphi-Quellcode:
procedure TForm1.Timer1Timer(Sender: TObject);
var TheWindowHandle: THandle;
begin
//if (GetAsyncKeyState(vk_Shift) < 0) AND (GetAsyncKeyState(VK_F10) < 0) then
//if GetAsyncKeyState(VK_F10) < 0 then
//if (GetAsyncKeyState(VK_CONTROL) < 0) AND (GetAsyncKeyState(VK_F10) < 0) then

if GetAsyncKeyState(VK_F10) < 0 then
//if (GetAsyncKeyState(VK_LMENU) < 0) and (GetAsyncKeyState(Ord('S')) < 0) then
//  if GetAsyncKeyState(VK_LMENU) < 0 then
//if (GetAsyncKeyState(VK_MENU) and 1 <> 0) then
//if GetAsyncKeyState(Ord('S')) < 0 then

 begin
  TheWindowHandle:=FindAWindow('Opera', '');
  if TheWindowHandle=0 then
    begin
      ShowMessage('Opera ist nicht geöffnet')
    end
  else
    begin
      setforegroundwindow(TheWindowHandle);
      keybd_event(VK_SHIFT, 0, 0, 0 );
      keybd_event(VK_ESCAPE, 0, 0, 0 );
      sendkeys('{S}', false);

      // Tasten wieder loslassen
      keybd_event(VK_ESCAPE, 0, KEYEVENTF_KEYUP, 0);
      keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);

      // ne kleine Pause
      sleep(1000);
    end;
 end;
end;
also wie gesagt ich will im endeffekt das ALT + S waomit man im IE und im Firefox z.b. das Posting abschickt simulieren, geht ja auch mit F10 nur halt nicht mit der ALT-Taste, das ist mein einziges Problem


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