AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Key's funktionieren nicht

Ein Thema von EWeiss · begonnen am 5. Apr 2018 · letzter Beitrag vom 7. Apr 2018
Antwort Antwort
Seite 1 von 2  1 2      
EWeiss
(Gast)

n/a Beiträge
 
#1

Key's funktionieren nicht

  Alt 5. Apr 2018, 21:10
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

Geändert von EWeiss ( 5. Apr 2018 um 21:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.354 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Key's funktionieren nicht

  Alt 6. Apr 2018, 07:57
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.
Peter
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
969 Beiträge
 
Delphi 6 Professional
 
#3

AW: Key's funktionieren nicht

  Alt 6. Apr 2018, 08:20
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: Key's funktionieren nicht

  Alt 6. Apr 2018, 11:14
Bei WM_LBUTTONDOWN setze ich den Focus auf den Container wo sich meine Sprites befinden.
Dieses wird dann identifiziert und ich setzte die FocusID.

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

Geändert von EWeiss ( 6. Apr 2018 um 12:37 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Key's funktionieren nicht

  Alt 6. Apr 2018, 12:19
Könnte Dir das hier eventuell weiterhelfen? Link 1Link 2
Aber da geht es um globale (!) Hotkeys.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#6

AW: Key's funktionieren nicht

  Alt 6. Apr 2018, 12:35
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
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.580 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Key's funktionieren nicht

  Alt 6. Apr 2018, 12:52
WM_GETDLGCODE könnte dir dabei helfen. Damit kannst du Windows Bescheid sagen, dass du bestimmte Systemtasten selber behandeln möchtest.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#8

AW: Key's funktionieren nicht

  Alt 6. Apr 2018, 12:57
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

Geändert von EWeiss ( 6. Apr 2018 um 13:20 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Key's funktionieren nicht

  Alt 7. Apr 2018, 20:22
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.
Angehängte Dateien
Dateityp: 7z Hot Keys.7z (22,8 KB, 3x aufgerufen)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#10

AW: Key's funktionieren nicht

  Alt 7. Apr 2018, 20:29
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
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:02 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