theo hat geschrieben:Ich hab's ja auch nur bei dem da abgetippt:
Ich bin vorsichtig geworden mit dem Übernehmen von code Schnipseln. Meist ist es besser, die Sache selbst aufzubauen und aus den Beispielen lediglich Denkanstösse zu entnehmen.
theo hat geschrieben:Ich hab's ja auch nur bei dem da abgetippt:
Code: Alles auswählen
function createKeyEvent(Display: Pdisplay; win: TWindow;
winRoot: TWindow; press: Boolean;
keycode: integer; modifiers: integer): TXKeyEvent;
var event: TXKeyEvent;
begin
event.display := display;
event.window := win;
event.root := winRoot;
event.subwindow := None;
event.time := CurrentTime;
event.x := 1;
event.y := 1;
event.x_root := 1;
event.y_root := 1;
event.same_screen := True;
event.keycode := XKeysymToKeycode(display, keycode);
event.state := modifiers;
if press then
event._type := KeyPress
else
event._type := KeyRelease;
result := event;
end;
function SendKey(winFocus: TWindow; PKeyCode: integer): string;
var winRoot: TWindow;
dpy: PDisplay;
revert: integer;
event: TXKeyEvent;
KEYCODE: integer;
begin
dpy := gdk_display;
winRoot := XDefaultRootWindow(Pointer(dpy));
//XGetInputFocus(dpy, @winFocus, @revert);
KEYCODE := PKeyCode;
event := createKeyEvent(dpy, winFocus, winRoot, true, KEYCODE, 0);
XSendEvent(event.display, event.window, True, KeyPressMask, @event);
event := createKeyEvent(dpy, winFocus, winRoot, false, KEYCODE, 0);
XSendEvent(event.display, event.window, True, KeyPressMask, @event);
end;
procedure TForm1.Button1Click(Sender: TObject);
var ziel: integer;
begin
ziel := 12345678; //ID von xev (geholt von xwininfo)
SendKey(ziel, ord('h'));
SendKey(ziel, ord('a'));
SendKey(ziel, ord('l'));
SendKey(ziel, ord('l'));
SendKey(ziel, ord('o'));
end;
_X_ hat geschrieben:Wenn ich es so mache, wie es oben steht schreibt er immer ins eigene Fenster.
KA warum.
_X_ hat geschrieben:Wie krieg ich mit ord Großbuchstaben?
Und was ist der Keycode für <tab>?
Code: Alles auswählen
/*
* TTY function keys, cleverly chosen to map to ASCII, for convenience of
* programming, but could have been arbitrary (at the cost of lookup
* tables in client code).
*/
#define XK_BackSpace 0xff08 /* Back space, back char */
#define XK_Tab 0xff09
#define XK_Linefeed 0xff0a /* Linefeed, LF */
#define XK_Clear 0xff0b
#define XK_Return 0xff0d /* Return, enter */
#define XK_Pause 0xff13 /* Pause, hold */
#define XK_Scroll_Lock 0xff14
#define XK_Sys_Req 0xff15
#define XK_Escape 0xff1b
#define XK_Delete 0xffff /* Delete, rubout */
_X_ hat geschrieben:Den Tab krieg ich nicht hin!
Code: Alles auswählen
unit afx;
interface
uses
SysUtils, Process, StdCtrls, Classes, Forms, lclintf, xlib, x, gdk;
{$define XK_BackSpace 0xff08} // Back space, back char
{$define XK_Tab 0xff09}
{$define XK_Linefeed 0xff0a} // Linefeed, LF
{$define XK_Clear 0xff0b}
{$define XK_Return 0xff0d} // Return, enter
{$define XK_Pause 0xff13} // Pause, hold
{$define XK_Scroll_Lock 0xff14}
{$define XK_Sys_Req 0xff15}
{$define XK_Escape 0xff1b}
{$define XK_Delete 0xffff} // Delete, rubout
procedure delay(msec:longint);
function createKeyEvent(Display: Pdisplay; win: TWindow; winRoot: TWindow; press: Boolean; keycode: integer; modifiers: string): TXKeyEvent;
function SendKey(winFocus: TWindow; PKeyCode: integer): string;
function SendKeyToActiveWindow(PTime: integer; PKeyCode: integer): string;
function SendStringToActiveWindow(PTime: integer; PString: string): string;
function DetectShiftState(ch: char): string;
implementation
procedure delay(msec:longint);
var
start,stop:longint;
begin
start := gettickcount;
repeat
stop := gettickcount;
application.processmessages;
until (stop - start ) >= msec;
end;
{=== Main ===}
function createKeyEvent(Display: Pdisplay; win: TWindow;
winRoot: TWindow; press: Boolean;
keycode: integer; modifiers: string): TXKeyEvent;
var event: TXKeyEvent;
begin
event.display := display;
event.window := win;
event.root := winRoot;
event.subwindow := None;
event.time := CurrentTime;
event.x := 1;
event.y := 1;
event.x_root := 1;
event.y_root := 1;
event.same_screen := True;
event.keycode := XKeysymToKeycode(display, keycode);
if modifiers = 'shift' then begin
event.state := shiftmask;
end
else begin
event.state := 0;
end;
if press then
event._type := KeyPress
else
event._type := KeyRelease;
result := event;
end;
function SendKey(winFocus: TWindow; PKeyCode: integer): string;
var winRoot: TWindow;
dpy: PDisplay;
revert: integer;
event: TXKeyEvent;
KEYCODE: integer;
sh: string;
begin
sh := DetectShiftState(chr(PKeyCode));
dpy := gdk_display;
winRoot := XDefaultRootWindow(Pointer(dpy));
KEYCODE := PKeyCode;
event := createKeyEvent(dpy, winFocus, winRoot, true, KEYCODE, sh);
XSendEvent(event.display, event.window, True, KeyPressMask, @event);
event := createKeyEvent(dpy, winFocus, winRoot, false, KEYCODE, sh);
XSendEvent(event.display, event.window, True, KeyPressMask, @event);
end;
function SendKeyToActiveWindow(PTime: integer; PKeyCode: integer): string;
var winFocus, winRoot: TWindow;
dpy: PDisplay;
revert: integer;
event: TXKeyEvent;
KEYCODE: integer;
sh: string;
begin
sh := DetectShiftstate(chr(PKeyCode));
dpy := gdk_display;
winRoot := XDefaultRootWindow(Pointer(dpy));
XFlush(dpy);
delay(PTime);
XGetInputFocus(dpy, @winFocus, @revert);
KEYCODE := PKeyCode;
event := createKeyEvent(dpy, winFocus, winRoot, true, KEYCODE, sh);
XSendEvent(event.display, event.window, True, KeyPressMask, @event);
event := createKeyEvent(dpy, winFocus, winRoot, false, KEYCODE, sh);
XSendEvent(event.display, event.window, True, KeyPressMask, @event);
end;
function SendStringToActiveWindow(PTime: integer; PString: string): string;
var I: integer;
begin
delay(PTime);
for I:= 1 to length(PString) do begin
SendKeyToActiveWindow(5, ord(PString[I]));
end;
end;
function DetectShiftState(ch: char): string;
begin
if ch in ['A'..'Z'] then begin
result := 'shift';
end
else begin
result := 'none';
end;
end;
end.
Code: Alles auswählen
function DetectShiftState(ch: char): string;
begin
if ch in ['A'..'Z'] then begin
result := 'shift';
end
else begin
result := 'none';
end;
end;
Code: Alles auswählen
SendStringToActiveWindow(5000, XK_TAB)