Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   WM_KEYDOWN in ApplicationEventsMessage() (https://www.delphipraxis.net/165012-wm_keydown-applicationeventsmessage.html)

taaktaak 10. Dez 2011 11:54

Delphi-Version: 7

WM_KEYDOWN in ApplicationEventsMessage()
 
Moin, Moin.

Ich muss mit TApplicationEvents Tastatureingaben (incl. Tastenkombinationen) auswerten. Je nach Tastenkombination werden verschiedene MenuEinträge oder Speedbuttons aufgerufen. Meine Lösung ist ...
Delphi-Quellcode:
procedure TfoMain.ApplicationEventsMessage(var Msg:tagMSG;var Handled:Boolean);
var Shift : TShiftState;
    Key  : Word;

 procedure GetShiftState(var Shift:TShiftState);
 var KeyboardState : TKeyboardState;
 begin
  Shift:=[];
  GetKeyboardState(KeyboardState);
  if (KeyboardState[vk_Shift]  and 128=128) then Shift:=Shift+[ssShift];
  if (KeyboardState[vk_Control] and 128=128) then Shift:=Shift+[ssCtrl];
  if (KeyboardState[vk_Menu]   and 128=128) then Shift:=Shift+[ssAlt];
 end;

begin
 if Msg.message=WM_KeyDown then begin

  GetShiftState(Shift);
  Key:=Msg.wParam;

  if Shift=[] then // ...................................................... xx
   case Msg.wParam of
    vk_F1 : begin m_HelpCommandsClick(nil); Handled:=true end;
    // ..
    end

  else

  if Shift=[ssShift] then // ......................................... Shift+xx
   case Msg.WParam of
    ord('O') : begin sbuInsertOperation.Click; Handled:=true end;
    // ..
    end

  else

  if Shift=[ssCtrl] then // ........................................... Ctrl+xx
   case Msg.WParam of
    vk_Up   : begin sbuUpSizeFont.Click; Handled:=true end;
    // ..
    end

  else

  if Shift=[ssAlt] then // ............................................. Alt+xx
   Showmessage('alt+xx')// wird NICHT erkannt

  else

  if Shift=[ssShift,ssCtrl] then // ............................. Shift+Ctrl+xx
   case Msg.WParam of
    ord('L') : begin sbuLoad.Click; Handled:=true end;
    // ..
    end

  else

  if Shift=[ssShift,ssAlt] then // ............................... Shift+Alt+xx
   Showmessage('shift+alt+xx') // wird als Shift+xx erkannt

  else

  if Shift=[ssCtrl,ssAlt] then // ................................. Ctrl+Alt+xx
   Showmessage('ctrl+alt+xx');        

  end;
end;
Für fast alle Kombinationen funktioniert das auch; aber leider nicht für die Fälle ALT+Taste und SHIFT+ALT+Taste. Hmm, war lange Zeit "inaktiv" und habe leider gar keine Idee. Das Erkennen von ALT+Taste wäre aber sehr wichtig! Wo ist der Fehler??

Bummi 10. Dez 2011 12:02

AW: WM_KEYDOWN in ApplicationEventsMessage()
 
Delphi-Quellcode:
if Msg.message=WM_SYSKEYDOWN then

taaktaak 10. Dez 2011 12:09

AW: WM_KEYDOWN in ApplicationEventsMessage()
 
Ok, funktioniert jetzt alles wie gewünscht!
Vielen Dank!


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