Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Tastendruck -> Mausklicks (https://www.delphipraxis.net/105080-tastendruck-mausklicks.html)

Saturos 15. Dez 2007 12:01


Tastendruck -> Mausklicks
 
Hallo Delphipraktiker :hi: , ich habe folgendes vor:
Ich möchte ein Programm schreiben, welches bei Gedrückthalten einer Taste an der aktuellen Cursorposition im aktiven Fenster Mausklicks ausführt. Das soll später in einem Spiel Anwendung finden.

Hier der bisherige Code:
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, ExtCtrls, StdCtrls, MMSystem, WinTypes, WinProcs;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Beenden1: TMenuItem;
    Beenden2: TMenuItem;
    Hilfe1: TMenuItem;
    Controls1: TMenuItem;
    Panel1: TPanel;
    Button1: TButton;
    Image1: TImage;
    Timer1: TTimer;
    procedure Beenden2Click(Sender: TObject);
    procedure Controls1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  anaus:boolean;
  x,y,m:integer;
  curs:tpoint;


implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 timer1.Enabled:=false;
 anaus:=false;
 image1.Picture.LoadFromFile('pics/rot.bmp');
end;

procedure TForm1.Beenden2Click(Sender: TObject);
begin
 Application.Terminate;
end;

procedure TForm1.Controls1Click(Sender: TObject);
var Msg:string;
begin
 Msg:='Durch Drücken des Enable/Disable-Buttons, wird das Programm aktiviert.'+#10#13+'Ist es aktiv, so werden durch Gedrückthalten'+#10#13+'der Taste "Ö" pro Sekunde 100 Mausklicks an der'+#10#13+'gegenwärtigen Zeigerposition ausgeführt. Ob das Programm'+#10#13+'aktiv ist, erkennt man an der gegenwärtigen Farbe der'+#10#13+'Signallampe neben dem Enable/Disable-Button- Rot=Inaktiv, Grün=Aktiv.';
 showmessage(msg);
end;

procedure TForm1.Button1Click(Sender: TObject); //Über diesen Button wird gesteuert, ob bei Tastendruck geklickt wird                                                oder nicht
begin
 if anaus=false then begin
  anaus:=true;
  image1.Canvas.Refresh;
  image1.Picture.LoadFromFile('pics/grün.bmp')
 end
 else if anaus=true then begin
  anaus:=false;
  image1.Canvas.Refresh;
  image1.Picture.LoadFromFile('pics/rot.bmp')
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i:integer;
begin
 for i:=1 to 10 do begin
  mouse_event(MOUSEEVENTF_LEFTDOWN, mouse.CursorPos.x, mouse.CursorPos.y, 0, 0);
  mouse_event(MOUSEEVENTF_LEFTUP, mouse.CursorPos.x, mouse.CursorPos.y, 0, 0)
 end;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if (Key = Ord('ö')) then begin
  m:=GetActiveWindow;
  GetCursorPos(curs);
  x:=Curs.x;
  y:=Curs.y;
   if anaus=true then
    timer1.Enabled:=true;
  end;
end;

end.
Ich habe schon mit Fensterhandles experimentiert, aber es scheitert, wie so oft schon daran, dass der Tastendruck (im Beispiel ö; auch andere getestet) von Delphi "wahrgenommen" wird :wall: .
Ich habe das Forum wirklich lange durchsucht, aber keine Lösung gefunden. :oops:

patti 15. Dez 2007 12:21

Re: Tastendruck -> Mausklicks
 
Zitat:

Zitat von Saturos
Ich habe schon mit Fensterhandles experimentiert, aber es scheitert, wie so oft schon daran, dass der Tastendruck (im Beispiel ö; auch andere getestet) von Delphi "wahrgenommen" wird :wall: .

Was genau meinst du mit "wahrgenommen" wird? Hast du KeyPreview von deiner Form an (im Objektinspektor einstellbar)?

Saturos 15. Dez 2007 15:41

Re: Tastendruck -> Mausklicks
 
Ja, wobei es auch manchmal ohne dessen Aktivierung ging. Wahrgenommen bedeutet hier, dass selbst dann, wenn ich das Prog aktiv habe und zum Beispiel ein anderes Bild auf Tastendruck einfügen lasse (testweise, anstelle der Klicks), Delphi nicht auf das Drücken der Taste reagiert.

patti 15. Dez 2007 15:48

Re: Tastendruck -> Mausklicks
 
Du könntest alternativ auch einen globalen Hier im Forum suchenHotkey definieren, bei dem du deinen Tastendruck simulierst. Der gilt dann systemweit und sollte immer funktionieren!

Die Muhkuh 15. Dez 2007 15:51

Re: Tastendruck -> Mausklicks
 
Hi,

wenn Dein Programm die Eingaben abfangen soll, dann bleiben Dir nur [dp]Hotkey[dp]s und Hier im Forum suchenHooks übrig.

Im OnKeyPress / OnKeyDown / OnKeyUp kommen die Buchstaben nur an, wenn Dein Programm den Fokus besitzt.

Saturos 15. Dez 2007 16:01

Re: Tastendruck -> Mausklicks
 
Gut, das hilft mir dann später weiter, aber momentan ist es noch so, dass nichteinmal dann, wenn mein Prog den "Fokus" hat die Buchstaben durchkommen.

Falls das hilft, habe ich Hier mal das Prog hochgeladen.

Saturos 15. Dez 2007 16:16

Re: Tastendruck -> Mausklicks
 
Danke :thumb: Dass es auf ö reagiert, hab ich zwar nicht hinbekommen, aber mit "o" geht es.

Saturos 15. Dez 2007 18:48

Re: Tastendruck -> Mausklicks
 
Zitat:

Zitat von patti
Du könntest alternativ auch einen globalen Hier im Forum suchenHotkey definieren, bei dem du deinen Tastendruck simulierst. Der gilt dann systemweit und sollte immer funktionieren!

Ich habe nun dazu entschlossen es mit den Hotkeys zu versuchen und gemerkt, dass ich die Keydownprocedur gar nich brauche :?
Hot-Keys systemweit setzen und verwenden <- Dort wurde im Beispiel Strg+F1 als Hotkey verwendet, aber für meine Zwecke ist ö nunmal ganz gut. Meine Frage ist nun, was ich in der Zeile:
Delphi-Quellcode:
...RegisterHotKey(Self.Handle, HotKeyID, MOD_SHIFT, VK_F1); ...
für VK_F1 einsetzen muss, um das ö als hotkey zu bekommen. In der Delphi-Hilfe stand unter Tastencodes etwas von Key_Odiaeresis für ö, aber das geht nicht. :gruebel:

Die Muhkuh 15. Dez 2007 18:49

Re: Tastendruck -> Mausklicks
 
Hi,

bin mir nicht ganz sicher, aber es dürfte das hier sein:

Delphi-Quellcode:
RegisterHotKey(Self.Handle, HotKeyID, MOD_SHIFT, Ord('ö'));
Hab den Aufruf jetzt nicht ganz im Kopf, falls es nicht klappt, müsstest mal in der Delphi-Hilfe bzw. im MSDN schauen, wenn es ein direkter API-Aufruf ist.

DeddyH 15. Dez 2007 18:49

Re: Tastendruck -> Mausklicks
 
Versuch es mal mit Ord('Ö')

[edit] Manuel *grmpf* :? [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.
Seite 1 von 4  1 23     Letzte »    

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