ich bastle seit einiger Zeit an einem Programm (unter LINUX UBUNTU) mit dem ich einen Ausschnitt des Bildschirms kopieren möchte. Anschließend möchte ich den Ausschnitt als Bitmap in mein Programm einfügen. Das heisst also mein Programm starten, dann meine "snipping procedure" starten, mein Programm minimiert sich, als Auslöser Tastenkombination drücken und Ausschnitt aufnehmen, mein Programm wird wieder normal groß. So der Idealfall.
Ich bin jetzt soweit das mit Xlib und XGrabKey das mit der Tastenkombi funktioniert. Ich schaffs aber nicht das mein Programm automatisch minimiert/maximiert wird. In welche Richtung muss ich da denken? Da XGrabKey nur geht wenn der Modifier genau stimmt ( Numlock oder Capslock aktiv) frag ich den jetzt ab, aber weiß Jemand wie ich eine Taste "drücken" kann. Hab da was mit XTestFakeKeyEvent gelesen, dazu find ich in FPC aber keine unit. Im Beispiel unten ist Strg+Shift+P die Tastenkombi.
Viele Grüße Bernd
Code: Alles auswählen
unit unit_TestHotkey;
{$mode objfpc}{$H+}
interface
uses
Classes,SysUtils,FileUtil,Forms,Controls,Graphics,Dialogs,StdCtrls,LCLIntf,LCLType,
{ diese Units brauch ich für xgrabkey}
x,Xlib,KeySym,XKBlib,XKB;
type
{ TForm1 }
TForm1 = class(TForm)
Button1 : TButton;
Frame1 : TFrame;
Bmp1 : TBitmap;
procedure FormCreate(Sender: TObject);
procedure StartHotKeyTest(Sender: TObject);
procedure Frame1Paint(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
function pruefeState:boolean;
var
dpy : PDisplay;
stateC : cardinal;
stateN : cardinal;
keycode : Integer;
begin
dpy := XOpenDisplay(nil);
(XkbGetIndicatorState (dpy, XkbUseCoreKbd, @stateC));
if (stateC and 1) = 1 then showmessage('Achtung!CapsLock ist ein');
//if (stateC and 1) = 0 then showmessage('Caps ist aus');
(XkbGetIndicatorState (dpy,XkbUseCoreKbd, @stateN));
if (stateN and 2) = 2 then showmessage('Achtung!NumLock ist ein');
//if (stateN and 2) = 0 then showmessage('Num ist aus');
if ((stateC and 1=1) or (stateN and 2 =2)) then pruefeState:=false else pruefeState:=true;
XCloseDisplay(dpy);
end;
function HotKey:TBitmap;
var
dpy : PDisplay;
root : TWindow;
ev : TXEvent;
modifiers : LongInt;
keycode : Integer;
grab_window : TWindow;
owner_events : LongInt;
pointer_mode : Integer;
keyboard_mode: Integer;
HK : boolean;
ScreenDC : HDC;
begin
dpy := XOpenDisplay(nil);
root := DefaultRootWindow(dpy);
HK := false;
modifiers := ControlMask or ShiftMask;
keycode := XKeysymToKeycode(dpy,XK_P);
grab_window := root;
owner_events := 0;//false;
pointer_mode := GrabModeAsync;
keyboard_mode := GrabModeAsync;
XGrabKey(dpy, keycode, modifiers, grab_window, owner_events, pointer_mode,
keyboard_mode);
XSelectInput(dpy, root, KeyPressMask );
while (HK=false) do
begin
XNextEvent(dpy,@ev);
case ev._type of KeyPress:
begin
ScreenDC := GetDC(0);
HotKey.LoadFromDevice(ScreenDC);
ReleaseDC(0,ScreenDC);
XUngrabKey(dpy,keycode,modifiers,grab_window);
HK:=true;
end;
end;
end;
XCloseDisplay(dpy);
end;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Caption :='HotKeyTest --- Drücke Strg+Shift+P';
Form1.Top := 50;
Form1.Left :=(Screen.DesktopWidth div 2)-400;
Form1.Height := 550;
Form1.Width := 800;
Form1.Color := clScrollBar;
Button1 := TButton.Create(nil);
Button1.Parent := Form1;
Button1.Top := 25;
Button1.Left := 25;
Button1.Height := 25;
Button1.Width := 150;
Button1.Caption := 'Start HotKeyTest';
Button1.OnClick := @StartHotKeyTest;
Frame1 := TFrame.Create(nil);
Frame1.Parent := Form1;
Frame1.Top := 75;
Frame1.Left := 50;
Frame1.Height := 450;
Frame1.Width := 700;
Frame1.Color := clwhite;
Frame1.OnPaint := @Frame1Paint;
Bmp1 := TBitmap.Create;
Bmp1.SetSize(700,450);
Bmp1.Canvas.Rectangle(0,0,700,450);
end;
procedure TForm1.StartHotKeyTest(Sender: TObject);
begin
if pruefeState then
begin
Bmp1.Canvas.StretchDraw(Rect(0,0,700,450),HotKey);
Frame1.Invalidate;
end;
end;
procedure TForm1.Frame1Paint(Sender: TObject);
begin
Frame1.Canvas.Draw(0,0,Bmp1);
end;
end.