Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Tasten ausgeben (https://www.delphipraxis.net/112932-tasten-ausgeben.html)

KleinAmann 29. Apr 2008 20:20


Tasten ausgeben
 
Hallo,

Ich bin neu in dem Fourm und beschäftige mich seit einiger Zeit mit Delphi.

Nun hab ich das Problem dass ich eine Taste ausgeben will, also einen Tastendruck simulieren.

Ich hab schon gesucht aber leider nichts gefunden wäre nett wenn ihr mir ein paar Tips gibt oder ein Beispiel machen/geben könntet.

Arbeite mit Delphi7

Mfg KleinAmann

Mackhack 29. Apr 2008 20:22

Re: Tasten ausgeben
 
Hast wirklich schon mal versucht Hier im Forum suchenTastendruck simulieren in der Suchfunktion einzugeben? Und da kommt nichts raus?

KleinAmann 29. Apr 2008 20:35

Re: Tasten ausgeben
 
hey,

ich hab bis jetzt immer nach virtuelle tastatur oder virtuellen tastendruck gesucht.
Wollte grad meinen Code den ich jetzt gerade noch geschrieben habe Posten hab da noch Fragen.

Naja sorry :(

PostMessage(wnd, WM_KEYDOWN, VK_SPACE, 0);

dieser Code virtualisiert ja eine Leertaste wenn ich aber VK_1 angebe also die Taste "1"
dann bringt er ein fehler was muss ich tun?

Fussball-Robby 29. Apr 2008 20:49

Re: Tasten ausgeben
 
Hier wurde die komplette Liste der virtuellen KeyCodes gepostet.

Mfg

KleinAmann 30. Apr 2008 16:21

Re: Tasten ausgeben
 
hey wenn ich jetzt schreib :

Delphi-Quellcode:
PostMessage(wnd, WM_KEYDOWN, VK_NUMPAD1, 0);
dann schreibt er ein "c" statts ne "1".

Wa hab ich falsch gemacht?

Mfg KleinAmann

Fussball-Robby 30. Apr 2008 16:34

Re: Tasten ausgeben
 
Probiers mal mit den Prozeduren hier:
Delphi-Quellcode:
procedure PressKey(Key: Word);overload;
begin
  keybd_event(Key, 0, 0, 0);
  keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;

procedure PressKey(Key: Char);overload;
begin
  PressKey(vkKeyScan(Key));
end;

//Aufruf:

  PressKey(vk_SPACE);//Entweder mit virtuellem KeyCode
  PressKey('h');    //Oder mit Char
Mfg

s-off 30. Apr 2008 18:02

Re: Tasten ausgeben
 
Zitat:

Zitat von Fussball-Robby
Hier wurde die komplette Liste der virtuellen KeyCodes gepostet.

Die stehen übrigens auch in der Delphi-Hilfe.

KleinAmann 2. Mai 2008 03:32

Re: Tasten ausgeben
 
hey,

Danke für die Funktion und in der Delphi Help steht nur Key_1 statt VK_NUMPAD1.

Ich hab folgendes Problem und zwar wen ich den befehl
PressKey(vk_NUMPAD1);
ausführen lasse dann erscheint im Editor nichts, wenn ich aber

PressKey(vk_NUMPAD1);
PressKey(vk_SPACE);
PressKey(vk_NUMPAD1);
PressKey(vk_SPACE);
PressKey(vk_NUMPAD1);
PressKey(vk_SPACE);

ausführen lasse dann ist eine Seite voller Einser (1), ich versteh das iwi nicht.
Sieht dann so aus -.-
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
nur die ganze Seite voll.
Ich hab hier den kompletten Code ist nur der Entwurf für ein Programm für mein Kumpel.
Delphi-Quellcode:
unit panel_start;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, Calendar, Menus, ComCtrls, ExtCtrls, StdCtrls, FileCtrl,
  Outline, DirOutln, OleCtrls, SHDocVw, OleServer, WordXP;

type
  TPanel = class(TForm)
    menu: TMainMenu;
    menucontroll: TMenuItem;
    Beenden2: TMenuItem;
    Minimieren1: TMenuItem;
    Kalender: TMonthCalendar;
    Button1: TButton;
    procedure Beenden2Click(Sender: TObject);
    procedure Minimieren1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Panel: TPanel;

implementation

{$R *.dfm}

procedure PressKey(Key: Word);overload;
begin
  keybd_event(Key, 0, 0, 0);
  keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
end;

procedure PressKey(Key: Char);overload;
begin
  PressKey(vkKeyScan(Key));
end;

procedure TPanel.Beenden2Click(Sender: TObject);
begin
Panel.Close;
end;

procedure TPanel.Minimieren1Click(Sender: TObject);
begin
Panel.WindowState := wsMinimized;
end;

procedure TPanel.Button1Click(Sender: TObject);
var
  wnd: HWND;
begin
  wnd := FindWindow('notepad', nil);
  begin
    wnd := FindWindowEx(wnd, 0, 'Edit', nil);

    PressKey(vk_NUMPAD1);
    PressKey(vk_SPACE);
    PressKey(vk_NUMPAD1);
    PressKey(vk_SPACE);
    PressKey(vk_NUMPAD1);
    PressKey(vk_SPACE);


  end;
end;

end.
Hab mir den unteren Teil so vorgestellt :
Delphi-Quellcode:
procedure TPanel.Button1Click(Sender: TObject);
var
  wnd: HWND;
begin
  wnd := FindWindow('notepad', nil);
  begin
    wnd := FindWindowEx(wnd, 0, 'notepad', nil);

    Sleep(5000);
    PressKey(vk_NUMPAD4);
    Sleep(5000);
    PressKey(vk_NUMPAD1);
    Sleep(5000);
    PressKey(vk_NUMPAD2);
    Sleep(5000);
    PressKey(vk_NUMPAD3);
    Sleep(5000);

  end;
end;
Das erste Sleep ist dafür dass man dummerweise auf den Button meines Programmes klicken muss und dann in das Fenser wo es dann
senden soll. Dann funktionierst. Da wollte ich Fragen ob es dort keine direkte engabe gibt dachte dass müsste mit FindWindow funktionieren.

MFG D©MI

toms 2. Mai 2008 03:59

Re: Tasten ausgeben
 
Zitat:

Zitat von KleinAmann
hey wenn ich jetzt schreib :

Delphi-Quellcode:
PostMessage(wnd, WM_KEYDOWN, VK_NUMPAD1, 0);
dann schreibt er ein "c" statts ne "1".

Wa hab ich falsch gemacht?

Mfg KleinAmann

Wenn du die Tasten mit keybd_event sendest, muss Notepad den Focus haben.
Mit PostMessage nicht.

Probiere es so:
Delphi-Quellcode:
PostKey(wnd, VK_NUMPAD1);
Delphi-Quellcode:
procedure PostKey(hWindow: HWND; key: Word);
begin
  if IsWindow(hWindow) then begin
    PostMessage(hWindow, WM_KEYDOWN, key,
      MakeLong(0, MapVirtualKey(key, 0)));
    PostMessage(hWindow, WM_KEYUP, key,
      MakeLong(0, MapVirtualKey(key, 0) or $C000));
  end;
end;

KleinAmann 7. Mai 2008 13:10

Re: Tasten ausgeben
 
hey danke für die Antworten,

Delphi-Quellcode:
procedure TPanel.Button1Click(Sender: TObject);
var
  i : Integer;
  wnd: HWND;
begin
  wnd := FindWindow('cabalmain', nil);
  if wnd <> 0 then
  begin
        wnd := FindWindowEx(wnd, 0, 'cabalmain', nil);
        i := 1;
        while i < 10 do
            begin
              if i = 1 then begin Sleep(4000); PressKey(vk_NUMPAD4); Edit2.Text := 'Taste 4 aktiviert'; i:= i+1; Sleep(1900); end;
              begin
                if i > 1 then
                begin
                  i:= i+1;
                  Edit2.Text := 'Taste 1 aktiviert';
                  PressKey(vk_NUMPAD1);
                  Sleep(1400);
                  Edit2.Text := 'Taste 2 aktiviert';
                  PressKey(vk_NUMPAD2);
                  Sleep(1400);
                  end else Edit2.Text := 'faild';
        end;
    end;
  end;
end;
leider funktioniert dass hier nur in Notepad und nicht bei der cabalmain.exe

was ist zu tun?

Naja sorry das ich Frag hatt kaum Internet letzter Zeit viel stress und meine Kumpels wollen endlich dass Programm also sry.

Mfg D○MI


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:08 Uhr.
Seite 1 von 2  1 2      

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