Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   WM_KEYDOWN wird nicht aufgerufen (https://www.delphipraxis.net/209051-wm_keydown-wird-nicht-aufgerufen.html)

venice2 18. Okt 2021 16:01

WM_KEYDOWN wird nicht aufgerufen
 
Delphi-Quellcode:
   
function WndProc(WinHandle: HWND; Msg: UINT; wP: WParam; lP: LParam): longint; stdcall;
begin

  case Msg of

    WM_KEYDOWN:
      begin
        if wP = VK_ESCAPE then
          DestroyWindow(WinHandle);
      end;

    WM_TIMER:
      SetImage(WinHandle);

    WM_NCHITTEST:
      begin
         Result := HTCAPTION;
         exit;
      end;

    WM_DESTROY:
      begin
         PostQuitMessage(0);
         Result := 0;
         exit;
      end;
  end;
  Result := DefWindowProc(WinHandle, Msg, wP, lP);

end;
Seltsames verhalten wieder.
Wenn ich ESC drücke wird WM_KEYDOWN nicht aufgerufen die anderen Tasten funktionieren aber.

venice2 18. Okt 2021 16:19

AW: WM_KEYDOWN wird nicht aufgerufen
 
Bitte wer es testen will.
Das
Delphi-Quellcode:
    WM_KEYDOWN:
      begin
        if wP = VK_END then
          DestroyWindow(WinHandle);
      end;
ersetzen mit
Delphi-Quellcode:
    WM_KEYDOWN:
      begin
        if wP = VK_ESCAPE then
          DestroyWindow(WinHandle);
      end;
geht bei mir nicht Taste geht aber in anderen Programmen.

EDIT:
Leider geht die dglOpenGL Unit nicht mit 64Bit deshalb habe ich die richtige Angehängt.
Einfach die alte ersetzen.
Manifest kann man in uMain deaktivieren ist nicht nötig!

Habe noch eine andere Texture hochgeladen.

venice2 18. Okt 2021 21:16

AW: WM_KEYDOWN wird nicht aufgerufen
 
Scheint niemand eine Lösung zu haben. Hmmm...
Das einzige was mit ESC funktioniert ist folgender Code.
Delphi-Quellcode:
//    WM_KEYDOWN:
//      begin
//        if wP = VK_END then
//          DestroyWindow(WinHandle);
//      end;

    WM_COMMAND:
      begin
        case LoWord(wP) of

          IDCANCEL:
            DestroyWindow(WinHandle);
        end;
      end;
Warum WM_KEYDOWN jetzt nicht geht keine Ahnung.
Wie kann ich denn nun alle Keys mit WM_KEYDOWN behandeln?

THY4243 18. Okt 2021 22:16

AW: WM_KEYDOWN wird nicht aufgerufen
 
In meinen Programmen geht das schon. Allerdings nutze ich nicht WM_KEYDOWN via Message.
Voraussetzung ist die Einstellung bei "KeyPreview".

Beispiel:
Delphi-Quellcode:
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
// ssShift   Die Taste Umschalt wird gedrückt gehalten.
// ssAlt   Die Taste Alt wird gedrückt gehalten.
// ssCtrl   Die Taste Strg wird gedrückt gehalten.
// ssLeft   Die linke Maustaste wird gedrückt gehalten.
// ssRight   Die rechte Maustaste wird gedrückt gehalten.
// ssMiddle   Die mittlere Maustaste wird gedrückt gehalten.
// ssDouble   Es wurde mit der Maus doppelgeklickt.
begin
  //if (key = VK_F1) or ((key = VK_F1) and (ssAlt IN Shift)) then {F1-taste - funktioniert nur, wenn Form1.KeyPreview:= true; }
  //ShowInfoDialog(Form1);
  if key = VK_ESCAPE then {ESC-taste - funktioniert nur, wenn Form1.KeyPreview:= true; }
  Close;
end;
Wobei "KeyPreview:= true;" in FormCreate gesetzt werden kann.

venice2 18. Okt 2021 22:29

AW: WM_KEYDOWN wird nicht aufgerufen
 
Danke.. Arbeite mit NonVcl und habe das Problem gefunden.
Es liegt an meiner Message Queue.
Delphi-Quellcode:
      while GetMessage(Msg, 0, 0, 0) do
      begin
        if IsDialogMessage(MainHandle, Msg) = False then // verhindert die Weitergabe einiger Key Eingaben (VK_RETURN, VK_ESCAPE)
        begin
          TranslateMessage(Msg);
          DispatchMessage(Msg);
        end;
      end;
So geht's
Delphi-Quellcode:
      while GetMessage(Msg, 0, 0, 0) do
      begin
          TranslateMessage(Msg);
          DispatchMessage(Msg);
      end;
Habe die Base WinMain aus einem anderen Projekt übernommen und nicht darauf geachtet.
Kommt davon wenn man nicht alles Neuschreibt. :)

Na ja jetzt habe ich 2 Möglichkeiten.

venice2 19. Okt 2021 13:07

AW: WM_KEYDOWN wird nicht aufgerufen
 
Kleine Abwandlung des vorherigen Projekt.

Einige Funktionen aus meiner Library mit Copy\Paste eingefügt man muß ja nicht alles neu schreiben. ;)
GradientPaintDC, MyAlphaBlend, DisplayDC, SetupAlphaChannel

Lösche die Anhänge nächste Woche wieder.


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