Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

Pudge

Trainee

  • "Pudge" is male
  • "Pudge" started this thread

Posts: 84

Date of registration: Oct 13th 2010

Location: Hannover

1

Monday, January 9th 2012, 9:03pm

Tastenanschläge auslesen (Delphi)

Hi, ich hab ein problem und zwar will ich in delphi Tastenanschläge auslesen, für ein kleines gimmick an dem ich bastel.
Das Problem dabei ist aber, dass das Programm im Hintergrund laufen soll (sprich minimiert) und ein anderes Programm
im Vordergrund ist.... hoffe mir kann einer von euch helfen...
Dumm ist, wer dummes tut :sleeping:

hamena314

Zerschmetterling

  • "hamena314" is male

Posts: 2,032

Date of registration: Aug 31st 2003

Location: Hannover

Occupation: Informatikstudent (d'uh)

2

Monday, January 9th 2012, 9:41pm

Nicht der Wind bestimmt die Richtung, sondern das Segel! (Lao Xiang, China)

Cid

Trainee

  • "Cid" is male

Posts: 81

Date of registration: Oct 5th 2005

Occupation: Informatik

3

Monday, January 9th 2012, 10:03pm

Irgendwie so... musst dann noch herausfinden welche IDs die anderen Zahlen haben...
einfach Programm anpassen, dass es falls es nicht die Zahl (als Buchstaben) kennt, die Zahl hinzufügt...
dann einmal das ABC in klein und einmal in groß schreiben.... und noch alles andere, was du haben willst...
Button1 = Hooken (Start)
Button2 = Unhooken (Ende)
kann man aber auch anders machen...
ebenso die Ausgabe in das Textfeld...

Gruß Cid
PS: aber mal ehrlich... schon was von Google gehört? Ich wette die haben da schon ganze Programme dafür als Sourcecode und nicht uralte Schnipsel von vor 2 Jahren oder so...
PPS: Das nächste Mal ruhig mit Version... das sollte jetzt unter Windoof XP mit Delphi 6 laufen... (Rest ist ungetestet)
-------------------------------------------------------------------
So, bisschen umgebaut... aaaaaber der haut alles raus was so passiert... ist ein wenig unschön... musst noch mal filtern, dass er nicht bei jeder Mausbewegung rumnervt... ;D
-------------------------------------------------------------------
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Memo1KeyPress(Sender: TObject; var Key: Char);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type t_evt = ^EVENTMSG;
var
Form1 : TForm1;
hookhandle : HHOOK;

implementation
{$R *.dfm}

procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);begin
createCaret(Memo1.Handle, 0, 8,15);
ShowCaret(Memo1.Handle);
SetCaretBlinktime(1500);
end;

procedure TForm1.FormCreate(Sender: TObject);begin
Button1.Enabled := TRUE;
Button2.Enabled := FALSE;
end;

function JournalCallBackProc(Code: Integer; wParam, lParam: longint): LRESULT;stdcall;
var res : string ;
var x : cardinal ;
var ev : t_evt;
begin
ev := ptr(lParam);
x := ev.paramL ;
res := '['+inttostr(x)+']';//default
if ev.message = 256 then begin
case x of
7745 : res := 'a' ;
//TODO FILL
end;
end;
Form1.Memo1.Text := Form1.Memo1.Text + res ;
end;

procedure TForm1.Button1Click(Sender: TObject);begin
hookhandle := SetWindowsHookEx(WH_JOURNALRECORD, @JournalCallBackProc , Hinstance, 0);
if hookhandle = 0 then begin
memo1.Lines.Add('Hook Failed');
end
else begin
memo1.Lines.Add('Hooked');
Button1.Enabled := FALSE;
Button2.Enabled := TRUE;
end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
if UnhookWindowsHookEx(hookhandle) then begin
memo1.Lines.Add('Unhooked');
Button2.Enabled := FALSE;
Button1.Enabled := TRUE;
end
else begin
memo1.Lines.Add('Unhooked');
end;
end;

end.
Ich bin ein Zweitsemester - bitte, belästigen Sie mich nicht damit! :sleeping:
Ein Mathematiker ist eine Maschine, die Kaffee in Theoreme verwandelt. -Paul Erdös

This post has been edited 2 times, last edit by "Cid" (Jan 9th 2012, 10:28pm)


Pudge

Trainee

  • "Pudge" is male
  • "Pudge" started this thread

Posts: 84

Date of registration: Oct 13th 2010

Location: Hannover

4

Monday, January 9th 2012, 10:12pm

ja ich hab schonmal was von google gehört, so vage am rand... und zum benutzen bin ich auch nicht zu blöd, aber wenn ich da nichts finde dacht ich kann man vll mal im forum fragen, da man hier die ganzen "nerds" ;) ja vereint hat ne...

P.S. danke für die schnelle ausfürliche antwort
Dumm ist, wer dummes tut :sleeping:

  • "Schokoholic" is male

Posts: 2,518

Date of registration: Oct 4th 2006

Location: Hannover

Occupation: Haarspaltung

5

Tuesday, January 10th 2012, 12:29am

Ansonsten geht auch immer die Win32-API:
  • Entweder schnell genug pollen mit GetAsyncKeyState.
  • Oder mit SetWindowsHookEx einen Low Level Keyboard Hook installieren. Theoretisch ginge auch ein normaler Keyboard Hook, aber dazu müsstest du den Code in ne DLL auslagern, die dann in dem Vordergrundprozess untergeschoben wird.

Die erste Methode ist sicher die einfachere, wenn es sich wirklich nur um "ein kleines Gimmick" handelt, kann aber nur jeweils eine Taste gleichzeitig testen. Das heißt, wenn du alle Tasten deiner Tastatur überwachen willst, brauchst du 100+ Funktionsaufrufe, und ziemlich oft pro Sekunde. Das kann schon unangenehm werden. Bei der zweiten Methode ist schon etwas mehr Windows-Magie erforderlich und du musst aufpassen, dass du nicht aus Versehen alle Tastenanschläge systemweit unterdrückst (außer Strg+Alt+Entf, das geht immer).

Kiki der Gecko

Regenbogeneidechse

Posts: 513

Date of registration: Oct 1st 2008

6

Tuesday, January 10th 2012, 9:50am

Das heißt, wenn du alle Tasten deiner Tastatur überwachen willst, brauchst du 100+ Funktionsaufrufe, und ziemlich oft pro Sekunde. Das kann schon unangenehm werden.


War das nicht eh so, dass die Tastatur/der Controller/das Übertragungsprotokoll zur Schnittstelle nur drei oder vier Tastendrücke gleichzeitig verarbeiten kann? Ich erinnere mich noch an die guten alten Versus-Spiele an der selben Tastatur, die dann aber doch nicht so toll waren, weil das mit der Eingabe so blöd war.

Kann aber sein, dass das auch mit PS/2 als Schinttstelle zu tun hatte und nun obsolet ist :)
"Alles ist eins - außer der Null." - Wau Holland

Pudge

Trainee

  • "Pudge" is male
  • "Pudge" started this thread

Posts: 84

Date of registration: Oct 13th 2010

Location: Hannover

7

Tuesday, January 10th 2012, 10:37am

Keine Sorge ich will nur 5-6 Tasten überwachen, deswegen sollte der aufwand da eher weniger sein, alls wenn ich ejden einzelnene tastenanschlag auslesen will
Dumm ist, wer dummes tut :sleeping: