Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Key's funktionieren nicht (https://www.delphipraxis.net/195907-keys-funktionieren-nicht.html)

EWeiss 5. Apr 2018 20:10

Key's funktionieren nicht
 
Einfache Sache eigentlich.

Delphi-Quellcode:
WM_KEYDOWN:
  begin

    case wp of
      VK_DOWN, VK_NUMPAD2:
      begin
     
      end;
    end;
  end;
VK_NUMPAD2 funktioniert
VK_DOWN nicht.

gruss

Jasocul 6. Apr 2018 06:57

AW: Key's funktionieren nicht
 
Diese Steuerungstasten werden vorher von Windows abgefangen, soweit ich mich erinnern kann. Das heißt, dass die bereits abgearbeitet sind, bevor die entsprechende Message bei dir ankommt.

Spontan fällt mir als Lösung nur ein systemweiter Tastaturhook ein. Aber vielleicht hatte ja schon jemand anderes mit dem Problem zu kämpfen und kennt eine bessere Lösung.

HolgerX 6. Apr 2018 07:20

AW: Key's funktionieren nicht
 
Hmm..

VK_Down wird seitens der Windows-Controls abgefangen, wenn diese einen Focus erhalten (z.B. Memo).

Bei VCL könnte mann das so umgehen (Quick and Dirty):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Application.OnMessage := OnAppMess;
end;

procedure TForm1.OnAppMess(var Msg: TMsg; var Handled: Boolean);
begin
  case Msg.message of
    WM_KEYDOWN   : begin
      Memo1.Lines.Add('WM_KEYDOWN ' + (IntToStr(Msg.WParam)));
    end;
  end;
end;
Wie Du das bei Non-VCL hin bekommst, weiß ich nicht, aber ich vermute wohl über KeyboardHook.

Stichworte: SetWindowsHookEx UnhookWindowsHookEx WH_KEYBOARD_LL

EWeiss 6. Apr 2018 10:14

AW: Key's funktionieren nicht
 
Bei WM_LBUTTONDOWN setze ich den Focus auf den Container wo sich meine Sprites befinden.
Dieses wird dann identifiziert und ich setzte die FocusID.

Delphi-Quellcode:
SprCon.gSetObjectFocusID(SprCon.CurOverObject, 1);
Wenn die Callback registriert ist feuere ich das Event.
Delphi-Quellcode:
        If Assigned(SprCon.g_Prop[gP].CallBack) then
        begin
          if SprCon.g_Prop[gP].CallBack(WinHandle, Msg, wP, lP) <> 0 then
          begin
            Result := 0;
            exit;
          end;
        end;
WM_KEYDOWN, UP tut nichts anderes als die Message über die Callback weiterzuleiten.
Warum soll die zu spät kommen?
VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT haben keine Auswirkung, alle VK_NUMPADxxx funktionieren hingegen.

Delphi-Quellcode:
    WM_KEYDOWN, WM_KEYUP:
      begin
        If Assigned(SprCon.g_Prop[gP].CallBack) then
        begin
          if SprCon.g_Prop[gP].CallBack(WinHandle, Msg, wP, lP) <> 0 then
          begin
            Result := 0;
            exit;
          end;
        end;
      end;
Zitat:

Wie Du das bei Non-VCL hin bekommst, weiß ich nicht, aber ich vermute wohl über KeyboardHook.
Habe in noch keiner Anwendung wegen dieser Keys einen Hook setzen müssen weder unter OpenGL noch mit WIn32API mitteln

gruss

KodeZwerg 6. Apr 2018 11:19

AW: Key's funktionieren nicht
 
Könnte Dir das hier eventuell weiterhelfen? Link 1Link 2
Aber da geht es um globale (!) Hotkeys.

EWeiss 6. Apr 2018 11:35

AW: Key's funktionieren nicht
 
Zitat:

Zitat von KodeZwerg (Beitrag 1398283)
Könnte Dir das hier eventuell weiterhelfen? Link 1Link 2
Aber da geht es um globale (!) Hotkeys.

Leider nein, bringt mich nicht weiter.
OK dann gehen halt nur die NumKeys inklusive VK_CONTROL.

Hook baue ich nicht ein.

gruss

jaenicke 6. Apr 2018 11:52

AW: Key's funktionieren nicht
 
WM_GETDLGCODE könnte dir dabei helfen. Damit kannst du Windows Bescheid sagen, dass du bestimmte Systemtasten selber behandeln möchtest.

EWeiss 6. Apr 2018 11:57

AW: Key's funktionieren nicht
 
Zitat:

Zitat von jaenicke (Beitrag 1398285)
WM_GETDLGCODE könnte dir dabei helfen. Damit kannst du Windows Bescheid sagen, dass du bestimmte Systemtasten selber behandeln möchtest.

Über die Accelerator table?
Wenn ja muss ich mal testen Danke.

@jaenicke Super Idee, das war's.
In meiner DLL!

Delphi-Quellcode:
    WM_GETDLGCODE:
      begin
        result := DLGC_WANTALLKEYS or DLGC_WANTARROWS;
        exit;
      end;
Und Auswertung in der Anwendung.
Ohne Hook oder der gleichen.

Delphi-Quellcode:
      WM_KEYDOWN:
        begin
          ObjectID := gSprCtrl.GI_GetObjectFocusID;
          if ObjectID > 0 then
          begin
            gSprCtrl.GD_GetObjectXY(ObjectID, x, y);
            x1 := x;
            y1 := y;

            if gSprCtrl.GI_IsCtrlKeyPressed then
            begin
              UseStep := 4;
              if gSprCtrl.GI_IsShiftKeyPressed then
                UseStep := 16;
            end else
              if gSprCtrl.GI_IsShiftKeyPressed then
                UseStep := 2
            else
            UseStep := 1;

            if gSprCtrl.GD_GetObjectScroll(ObjectID) then
            begin
              gSprCtrl.GI_GetBitmapSize(gSprCtrl.GI_GetBMP(WinHandle), Width, Height);
            end else
            begin
              GetClientRect(WinHandle, rc);
              Width := rc.Right;
              Height := rc.Bottom;
            end;
            gSprCtrl.GD_GetObjectBound(ObjectID, BoundWidth, BoundHeight);

            x2Div2 := BoundWidth div 2;
            y2Div2 := BoundHeight div 2;

            case wp of
              VK_HOME:
                x1 := 0;
              VK_END:
                x1 := MAX(Width - BoundWidth, 0);
              VK_PRIOR:
                y1 := 0;
              VK_NEXT:
                y1 := MAX(Height - BoundHeight, 0);
              VK_LEFT, VK_NUMPAD4:
                if x1 > -x2Div2 then
                  x1 := MAX(x1 - UseStep, -x2Div2);
              VK_UP, VK_NUMPAD8:
                if y1 > -y2Div2 then
                  y1 := MAX(y1 - UseStep, -y2Div2);
              VK_RIGHT, VK_NUMPAD6:
                if x1 < Width - x2Div2 then
                  x1 := MIN(x1 + UseStep, Width - x2Div2);
              VK_DOWN, VK_NUMPAD2:
                if y1 < Height - y2Div2 then
                  y1 := MIN(y1 + UseStep, Height - y2Div2);
            end;

            if (x <> x1) or (y <> y1) then
            begin
              x := x1;
              y := y1;
              gSprCtrl.GD_SetObjectXY(ObjectID, x1, y1, true);
            end;
            sMessage := 'Object ' + IntToStr(ObjectID) + ' coordinates ' + IntToStr(x) + ',' + IntToStr(y);
            ShowTip(true, sMessage);
          end;
        end;
Hat sich erledigt..

SHIFT + CONTROL + VK_DOWN geht nun ohne Probleme.
Das verschieben des Objects findet dann mit 16Facher Geschwindigkeit statt.

gruss

KodeZwerg 7. Apr 2018 19:22

AW: Key's funktionieren nicht
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hat etwas gedauert, ich wusste doch das ich noch etwas finde.
Anbei ein Source der dir per WinApi erklärt wie man alle Tasten abfangen kann.
Bei Ausführung klicke dich in das rechte Edit und Teste Tasten.
Ich hoffe diesmal richtig zu liegen auch wenn das Thema deinerseits zu war.

EWeiss 7. Apr 2018 19:29

AW: Key's funktionieren nicht
 
Das ist lieb und bestimmt nett gemeint aber ich benötige es nicht.
Es ging mir nur um die Vier Arrow tasten und diese kann ich mit der Window Message

Delphi-Quellcode:
    WM_GETDLGCODE:
       begin
         result := DLGC_WANTALLKEYS or DLGC_WANTARROWS;
         exit;
       end;
meiner Anwendung zuordnen vorausgesetzt der Focus ist vorher beim zu verwendenden Objekt gesetzt.
Wie ich die Tasten auswerten bzw.. abfangen kann ist mir geläufig.

Trotzdem Danke.

gruss


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