AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi WM_KEYDOWN: repeat-count aus dem lparam lesen
Thema durchsuchen
Ansicht
Themen-Optionen

WM_KEYDOWN: repeat-count aus dem lparam lesen

Ein Thema von Hedge · begonnen am 15. Sep 2008 · letzter Beitrag vom 16. Sep 2008
Antwort Antwort
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#1

WM_KEYDOWN: repeat-count aus dem lparam lesen

  Alt 15. Sep 2008, 21:15
Möchte gerne ermitteln ob eine Taste zum ersten Mal gedrückt wurde oder eben gehalten wird.

Das geht entweder mit WM_KEYUP, denn das wird ja nur 1 Mal ausgeführt oder auch mit dem repeat-count von WM_KEYDOWN

laut MSDN steht der repeat-count in den ersten 16 bytes des lparam.

Ich habe gelesen, dass man diese mit LOWORD (lParam) auslesen kann, aber irgendwie zündet das nicht so bei mir.

Delphi-Quellcode:
P := PEventMsg(lParam);
If P^.Message = WM_KEYDOWN then
begin
   Form1.Label1.Caption:=IntToStr((LOWORD(P^.paramL)));
end;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: WM_KEYDOWN: repeat-count aus dem lparam lesen

  Alt 15. Sep 2008, 21:17
Was ist denn PeventMsg?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#3

Re: WM_KEYDOWN: repeat-count aus dem lparam lesen

  Alt 15. Sep 2008, 21:21
das Ganze ist eine Callback-Funktion:

Delphi-Quellcode:
function MouseHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
  P: PEventMsg;
begin
  Result := CallNextHookEx(0, nCode, wParam, lParam);
  If nCode = HC_ACTION then
  begin
     If lParam <> 0 then
     begin
         P := PEventMsg(lParam);
      If P^.Message = WM_KEYDOWN then
       begin
       Form1.Label1.Caption:=IntToStr((LOWORD(P^.paramL)));
       end
     end
  else
     exit;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: WM_KEYDOWN: repeat-count aus dem lparam lesen

  Alt 15. Sep 2008, 21:26
Und da kommt dann was raus?
IMHO wird der Zähler auch zurückgesetzt.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#5

Re: WM_KEYDOWN: repeat-count aus dem lparam lesen

  Alt 15. Sep 2008, 21:32
Ich will eigentlich nur die ersten 16 Bytes des lparam isolieren, damit ich sehe wie oft die Taste aktiviert wurde hintereinander.

aus MSDN:

Zitat:
WM_KEYDOWN

WPARAM wParam
LPARAM lParam;


Parameters

wParam
Specifies the virtual-key code of the nonsystem key.
lParam
Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following table.

0-15
Specifies the repeat count for the current message. The value is the number of times the keystroke is autorepeated as a result of the user holding down the key. If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
16-23
Specifies the scan code. The value depends on the OEM.
24
Specifies whether the key is an extended key, such as the right-hand ALT and CTRL keys that appear on an enhanced 101- or 102-key keyboard. The value is 1 if it is an extended key; otherwise, it is 0.
25-28
Reserved; do not use.
29
Specifies the context code. The value is always 0 for a WM_KEYDOWN message.
30
Specifies the previous key state. The value is 1 if the key is down before the message is sent, or it is zero if the key is up.
31
Specifies the transition state. The value is always zero for a WM_KEYDOWN message.
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: WM_KEYDOWN: repeat-count aus dem lparam lesen

  Alt 15. Sep 2008, 21:35
Ich würde sagen: Here you are:
Zitat:
If the keystroke is held long enough, multiple messages are sent. However, the repeat count is not cumulative.
Du musst also selber hochzählen. Und wann du den Zähler reseten musst, steht in Bit 30.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Hedge

Registriert seit: 30. Jun 2007
278 Beiträge
 
Delphi 2009 Professional
 
#7

Re: WM_KEYDOWN: repeat-count aus dem lparam lesen

  Alt 15. Sep 2008, 22:20
Ah! Jetzt raff ichs. Vor dem selben Problem stand ich schon mal.

Jedoch scheint JournalHook bei den Parametern eine Schwäche zu haben, denn egal wie ich das 30. Bit prüfe, es kommt nix dabei raus...
Hier meine Testkandidaten:

Delphi-Quellcode:
const
  PREV_KEY_STATE = 1 shl 30; // $40000000
begin
  // ...
  if lparam and PREV_KEY_STATE = PREV_KEY_STATE then Beep;
  // ..
end;
und:

if Odd(lparam shr 30) then Beep; Nix beep't
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: WM_KEYDOWN: repeat-count aus dem lparam lesen

  Alt 16. Sep 2008, 10:12
Kein Ahnung bei dem Hook. In der normalen Message im Process funkioniert es.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


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 06: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