AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi mit peekmessages keyboardqueue abrufen
Thema durchsuchen
Ansicht
Themen-Optionen

mit peekmessages keyboardqueue abrufen

Ein Thema von DGL-luke · begonnen am 12. Jun 2005 · letzter Beitrag vom 15. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#1

mit peekmessages keyboardqueue abrufen

  Alt 12. Jun 2005, 15:03
ich brauche GLOBAL also systemweit die letzte gedrückte taste.
das geht offenbar mit peekmessage, udn ich hab hier auhc schon viele threads gefunden, in denen der queue gelöscht oder beschribeen wird. aber wie kann ich lesen?

mein erster versuch(eigentlich der zehnte)

Delphi-Quellcode:
PeekMessage(Msg,0,WM_KEYFIRST,WM_KEYLAST,PM_NOREMOVE);
label3.Caption:=inttostr(msg.wParam);
gibt aber unsinnige werte zurück.

wie muss es denn richtig heissen?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: mit peekmessages keyboardqueue abrufen

  Alt 13. Jun 2005, 17:20
*push*

für das aktuelle fenster geht es tatsächlich mit

Delphi-Quellcode:
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
var Msg:TMsg;
begin
while PeekMessage(Msg,0,WM_KEYFIRST,WM_KEYLAST,PM_REMOVE) do
keybeenpressed(msg.wParam);
end;
Allerdings eben nicht global. desktophandle(GetDesktopWindow) schient auch nicht zu helfen. gibt es einen weg, den globalen Nachrichtenqueue zu überwachen?
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#3

Re: mit peekmessages keyboardqueue abrufen

  Alt 14. Jun 2005, 05:38
Leider wird der Queue mit PeekMessage() von "vorne nach hinten" also vom "ältesten zum neuesten" Tastaturereignis ausgelsen. Sprich mit PeekMessage() bekommt man eben nicht die aktuell zu letzt gedrückte Taste geliefert.

Gruß hagen
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: mit peekmessages keyboardqueue abrufen

  Alt 14. Jun 2005, 06:47
Du kannst mit SetWindowsHookEx und WH_KEYBOARD eine Schnüffel-Prozedur (einen Hook) für Tastaturereignisse setzen und dir so die jeweils zuletzt gedrückte Taste selbst merken. Die bekommt IMHO dieselben Parameter wParam und lParam wie die entsprechenden Fenstermeldungen.
Volker
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#5

Re: mit peekmessages keyboardqueue abrufen

  Alt 14. Jun 2005, 13:31
danke! das hört sich gut an. hab jetzt diesen code:

Delphi-Quellcode:
//globale funktion
function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM)
:LRESULT; stdcall;
begin
form1.keybeenpressed(wParam);
result:=callnexthookex(hookhandle,ncode,wparam,lparam);
end;

//formcreate
procedure TForm1.FormCreate(Sender: TObject);
begin
CTI1.MinimizeToTray:=true;
CTI1.IconVisible:=true;
hookhandle:=setwindowshookex(WH_KEYBOARD,@KeyboardHookProc,0,0);
end;

//formdestroy
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnhookWindowsHookEx(hookhandle);
end;
keybeenpressed wird aber anscheinend nie aufgerufen...
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: mit peekmessages keyboardqueue abrufen

  Alt 14. Jun 2005, 13:35
Wenn du die Tastatureingaben global haben willst, dann muss der Code in einer DLL liegen, die du in jeden Prozess injezierst.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

Re: mit peekmessages keyboardqueue abrufen

  Alt 14. Jun 2005, 13:44
Zitat von Luckie:
Wenn du die Tastatureingaben global haben willst, dann muss der Code in einer DLL liegen, die du in jeden Prozess injezierst.
Genau! Sorry, hatte ich vergessen dazu zu schreiben. Hier die entsprechende Stelle aus der Doku:
Zitat von ms-help://borland.bds3/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.htm:
lpfn
[in] Pointer to the hook procedure. If the dwThreadId parameter is zero or specifies the identifier of a thread created by a different process, the lpfn parameter must point to a hook procedure in a dynamic-link library (DLL). Otherwise, lpfn can point to a hook procedure in the code associated with the current process.
Volker
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#8

Re: mit peekmessages keyboardqueue abrufen

  Alt 14. Jun 2005, 15:20
richtig, hab ich auhc gemerkt, als ich einen thread fand, der sich auf eine von hagen geschribeene hook-dll bezog. hab die dann mehr oder weniger kopiert, und folgendes daraus gemacht:

Delphi-Quellcode:
library P_Hook;

uses
  Windows,
  Messages,
  sysutils;

var hookhandle:cardinal=0;
    key:integer=0;
    keynew:boolean=false;

function KeyboardHookProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM):
LRESULT; stdcall;
begin
//es ist ebenfalls möglich die Bearbeitung an eine Bedingung zu knüpfen
//it's possible to call CallNextHookEx conditional only.
  Result := CallNextHookEx(HookHandle, nCode, wParam, lParam);
  key:=wparam;
  keynew:=true;
end;

function getLastKey:integer;
begin
if keynew then result:=key
else result:=-1;
keynew:=false;
end;


function InstallHook: Boolean; stdcall;
begin
  Result := False;
  if HookHandle = 0 then begin
//Erstmal Hook installieren
//First install the hook
    HookHandle := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookProc,
    HInstance, 0);

    Result := TRUE;
  end;
end;

function UninstallHook: Boolean; stdcall;
begin
//Hook aus der Hookchain entfernen
//Uninstall hook from hook chain
  Result := UnhookWindowsHookEx(HookHandle);
  HookHandle := 0;
end;

exports
//Installations- und Deinstallationsroutine exportieren
//Export the installation and deinstallation routine
  InstallHook,
  UninstallHook,
  getLastKey;

end.
alles in der mainformunit statisch gelinkt per "external 'sowieso'".
Wenn ich nun alles schön im formcreate initialisiere und getlastkey per timer aufrufe, geht es aber immernoch nur in der eigenen mainform....
muss ich irgendwie noch in meiner mainform loadlibrary machen und die Adresse an Installhook weitergeben oder sowas? wie ich sehe, scheint hier ja HInstance das eigenhandle der DLL zu sein, das müsste also so stimmen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

Re: mit peekmessages keyboardqueue abrufen

  Alt 14. Jun 2005, 15:39
Hmmm ... es kann sein, dass "HInstance" das vom Prozess ist und nicht von der DLL.
Versuch doch mal "FindHInstance(@InstallHook)".
Volker
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#10

Re: mit peekmessages keyboardqueue abrufen

  Alt 14. Jun 2005, 19:15
nein, geht auch nicht.

vielleicht hat ja hagen noch was zu sagen, nachdem es ja praktisch sein Hook ist.... *hoff*
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 01:09 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