Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi wndproc geht nicht (https://www.delphipraxis.net/210835-wndproc-geht-nicht.html)

milurt 29. Jun 2022 20:52

AW: wndproc geht nicht
 
ich habe das problem, dass bei peekmessage niemals ein wm_char kommt, wenn ich eine taste drücke.

himitsu 29. Jun 2022 22:49

AW: wndproc geht nicht
 
Ich seh kein PeekMessage im Code. (#20)

Außerdem ist da schonwieder lpClassName und lpWindowsName im CreateWindow vertauscht, bzw. es wird eine Klasse registriert, die nie verwendet wird.




Und nicht alle Messages kommen aus PeekMessage/GetMessage raus.
z.B. Alles, was SendMessage betrifft, wird direkt innerhalb von PeekMessage/GetMessage verarbeitet und garnicht zurückgegben.

Ebenso liegen z.B. WM_TIMER garnicht in der MessageQueue, sondern werden direkt im PeekMessage/GetMessage generiert und rausgegeben.

milurt 30. Jun 2022 10:19

AW: wndproc geht nicht
 
bei meinem #20 letzten beitrag ist in readkm ein peekmessage.
wie liest man also von der tastatur zeichen?
wozu brauche ich wm_timer dabei?

milurt 30. Jun 2022 10:21

AW: wndproc geht nicht
 
wenn bei createwindow zuerst S2 und dann S1 steht ist das wirklich falsch?
das ist nicht createwindowex

KodeZwerg 30. Jun 2022 12:03

AW: wndproc geht nicht
 
Bitte lese Dir ein paar Non-VCL Dokumentationen durch, Michael Puff war ein begeisterter und talentierter Non-VCL Programmierer, seine Resourcen sind immer noch abrufbar.
Die Art und Weise wie Du es versuchst ist .... schräg.

Mein Rat, ich würde die Tastatur-Abfrage in einen Timer schubsen, kleines mini Beispiel:
Delphi-Quellcode:
// global
var
  HID: Integer;
  Msg: TMsg;

// hier eine timer methode für tasten
procedure HotkeyTimer(TimerID, Msg: Uint; dwUser, dw1, dw2: DWord); pascal;
BEGIN
 if (GetKeyState(VK_P) and (1 shl 31)) <> 0) // wurde taste "P" gedrückt
 then
   // mach was wenn P gedrückt wurde.... nur als beispiel
 ;
END;


// hier folgt der hauptaufruf um die klasse und deren objekte zu erschaffen

// nachdem du deine klasse mal ordentlich initialisiert hast und auch nutzt, diese zeile aktiviert einen windows timer der alle 10ms abgerufen wird
HID := TimeSetEvent(10, 0, @HotkeyTimer, 0, TIME_PERIODIC);

// nach diesem Aufruf folgt die Message behandlung, regulär so:
 while(GetMessage(Msg, Handle, 0, 0)) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;

// damit wenn der loop beendet ist du die klasse und alle anderen objekte auch wieder freigeben kannst
  TimeKillEvent(HID);
// edit
das obige versetzt die tastatur-abfrage systemweit, also von jedem window aus werden die tasten geprüft und ausgewertet!

himitsu 30. Jun 2022 15:39

AW: wndproc geht nicht
 
Timer ist unnötig.

Entwerder es wird in der MessageLoop (nach GetMessage/PeekMessage) gemacht, indem man auf die gewünschten Tastatur-Messages reagiert,
oder in einer WindowProc. (via GWL_WNDPROC an eine bestehenden Klasse/Instanz angehängt, oder mit RegisterClass über eine eigene WindowClass)

KodeZwerg 30. Jun 2022 16:30

AW: wndproc geht nicht
 
Zitat:

Zitat von himitsu (Beitrag 1508211)
Timer ist unnötig.

Entwerder es wird in der MessageLoop (nach GetMessage/PeekMessage) gemacht, indem man auf die gewünschten Tastatur-Messages reagiert,
oder in einer WindowProc. (via GWL_WNDPROC an eine bestehenden Klasse/Instanz angehängt, oder mit RegisterClass über eine eigene WindowClass)

Ich bin mir da nicht so ganz sicher ob er überhaupt ein Control hat das fokussiert werden kann und Tasten akzeptiert, sein API Quelltext ist sehr schwer zu entziffern.

himitsu 30. Jun 2022 16:41

AW: wndproc geht nicht
 
Mindestens die Form hat hat den Fokus, selbst wenn nichts drauf ist (so wie hier).

Und in der Schleife kommt auch erstmal Alles vorbei. (und Msg.hWnd kann man hier ja ignorieren)


GetKeyState/GetAsyncKeyState haben auch nur den Tastenstatus von innerhalb der aktuell/letzten abgerufenen Message.

Problem beim Timer ist auch, wenn man GetKeyState falsch auswertet, dann gehen da womöglich gedrückte Tasten verloren, wenn die Taste nicht gerade beim GetKeyState gedrückt wird, sondern zwischen den beiden letzten GetKeyState gedrückt wurde.
Und was beim GetKeyState immer verloren geht, wenn eine Taste mehrmals zwischen den GetKeyState gedrückt wurde.

milurt 30. Jun 2022 17:27

AW: wndproc geht nicht
 
ich denke ich werde es so machen:
Code:
if GetKeyState(65) And $80 Then {taste a}

KodeZwerg 30. Jun 2022 21:13

AW: wndproc geht nicht
 
Zitat:

Zitat von milurt (Beitrag 1508217)
ich denke ich werde es so machen:
Code:
if GetKeyState(65) And $80 Then {taste a}

Warum nutzt Du nicht vorgegebene Konstanten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:13 Uhr.
Seite 3 von 4     123 4      

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