AGB  ·  Datenschutz  ·  Impressum  







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

wndproc geht nicht

Ein Thema von milurt · begonnen am 19. Jun 2022 · letzter Beitrag vom 1. Jul 2022
Antwort Antwort
Seite 3 von 4     123 4      
milurt

Registriert seit: 16. Dez 2020
30 Beiträge
 
#21

AW: wndproc geht nicht

  Alt 29. Jun 2022, 21:52
ich habe das problem, dass bei peekmessage niemals ein wm_char kommt, wenn ich eine taste drücke.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#22

AW: wndproc geht nicht

  Alt 29. Jun 2022, 23:49
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
milurt

Registriert seit: 16. Dez 2020
30 Beiträge
 
#23

AW: wndproc geht nicht

  Alt 30. Jun 2022, 11:19
bei meinem #20 letzten beitrag ist in readkm ein peekmessage.
wie liest man also von der tastatur zeichen?
wozu brauche ich wm_timer dabei?
  Mit Zitat antworten Zitat
milurt

Registriert seit: 16. Dez 2020
30 Beiträge
 
#24

AW: wndproc geht nicht

  Alt 30. Jun 2022, 11:21
wenn bei createwindow zuerst S2 und dann S1 steht ist das wirklich falsch?
das ist nicht createwindowex
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: wndproc geht nicht

  Alt 30. Jun 2022, 13:03
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!
Gruß vom KodeZwerg

Geändert von KodeZwerg (30. Jun 2022 um 13:12 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#26

AW: wndproc geht nicht

  Alt 30. Jun 2022, 16:39
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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: wndproc geht nicht

  Alt 30. Jun 2022, 17:30
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#28

AW: wndproc geht nicht

  Alt 30. Jun 2022, 17:41
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (30. Jun 2022 um 17:44 Uhr)
  Mit Zitat antworten Zitat
milurt

Registriert seit: 16. Dez 2020
30 Beiträge
 
#29

AW: wndproc geht nicht

  Alt 30. Jun 2022, 18:27
ich denke ich werde es so machen:
Code:
if GetKeyState(65) And $80 Then {taste a}
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

AW: wndproc geht nicht

  Alt 30. Jun 2022, 22:13
ich denke ich werde es so machen:
Code:
if GetKeyState(65) And $80 Then {taste a}
Warum nutzt Du nicht vorgegebene Konstanten?
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 4     123 4      

 

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 10:33 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