![]() |
Key's funktionieren nicht
Einfache Sache eigentlich.
Delphi-Quellcode:
VK_NUMPAD2 funktioniert
WM_KEYDOWN:
begin case wp of VK_DOWN, VK_NUMPAD2: begin end; end; end; VK_DOWN nicht. gruss |
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. |
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:
Wie Du das bei Non-VCL hin bekommst, weiß ich nicht, aber ich vermute wohl über KeyboardHook.
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; Stichworte: SetWindowsHookEx UnhookWindowsHookEx WH_KEYBOARD_LL |
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:
Wenn die Callback registriert ist feuere ich das Event.
SprCon.gSetObjectFocusID(SprCon.CurOverObject, 1);
Delphi-Quellcode:
WM_KEYDOWN, UP tut nichts anderes als die Message über die Callback weiterzuleiten.
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; 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:
gruss |
AW: Key's funktionieren nicht
|
AW: Key's funktionieren nicht
|
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.
|
AW: Key's funktionieren nicht
Zitat:
Wenn ja muss ich mal testen Danke. @jaenicke Super Idee, das war's. In meiner DLL!
Delphi-Quellcode:
Und Auswertung in der Anwendung.
WM_GETDLGCODE:
begin result := DLGC_WANTALLKEYS or DLGC_WANTARROWS; exit; end; Ohne Hook oder der gleichen.
Delphi-Quellcode:
Hat sich erledigt..
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; SHIFT + CONTROL + VK_DOWN geht nun ohne Probleme. Das verschieben des Objects findet dann mit 16Facher Geschwindigkeit statt. gruss |
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. |
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:
meiner Anwendung zuordnen vorausgesetzt der Focus ist vorher beim zu verwendenden Objekt gesetzt.
WM_GETDLGCODE:
begin result := DLGC_WANTALLKEYS or DLGC_WANTARROWS; exit; end; Wie ich die Tasten auswerten bzw.. abfangen kann ist mir geläufig. Trotzdem Danke. gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:48 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz