![]() |
einfache Bildschirmtastatur
hallo, ich suche nach Ansätzen für eine einfache Bildschirmtastatur zu schreiben.
Ich würde diese ggf auf Basis eines transparenten Images machen und dort die Koordinaten der Mausklicks abfragen und weiterleiten .... Mein größtes Problem ist eigendlich, das in fremden Anwendungen umzuleiten...weiss da keinen Ansatz und auch in der API bin ich nicht so bewandert. Logisch würde klingen, das in der fremden Anwendung focused Control sich zu merken, die Tastatur aufzuschlagen und dort die Taste wieder an das gemerkte externe Control zurück.. Wie macht man sowas???? MfG bluescreen25 |
Re: einfache Bildschirmtastatur
Hallo,
die Bildschirmtastatur von Windows ist Topmost. Wenn man die Bildschirmtastatur verschiebt setzt diese sich dadurch wieder in den Vordergrund. Wenn man dann mit der Maus wieder über die Tastatur geht, wird das zuletzt aktive Fenster wieder in den Vordergrund gebracht. Ich habe mal etwas herumexperimentiert, leider flackert das alles noch ein bisschen, da man beim klicken auf den Button das Fenster immer wieder nach vorne bringt.
Delphi-Quellcode:
private
hForeground : HWND; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin SetWindowPos(self.Handle, HWND_NOTOPMOST + WORD(true), 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); end; procedure TForm1.SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin windows.SetForegroundWindow(hForeground); end; procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin windows.keybd_event(ord('A'), 0, 0, 0);//Beispiel keybd_event(ord('A'), 0, KEYEVENTF_KEYUP, 0); end; procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin hForeground := windows.GetForegroundWindow; end; |
Re: einfache Bildschirmtastatur
Zitat:
Danke für Ausführungen, ich habe selbst gestern versucht mit sendkeys etwas auf die Beine zu stellen, bekam komischerweise nur in einem Timer den Buchstaben gesendet, obwohl das Handle klar war, über einen Button gings nicht. Bei deinem Code habe ich das Problem, das sowaohl beim Mousedown und beim MouseUp ein A gesendet wird, das ich aber nicht so ganz verstehe. Gruß, bluescreen25 |
Re: einfache Bildschirmtastatur
Die Bildschirmtastatur sorft einfach mit dem richtigen Windowstyle dafür das sie nicht den Focus bekommt wenn man sie anklickt (sie wird also NICHT aktiviert und setzt danach das letzte Fenster wieder aktiv)
|
Re: einfache Bildschirmtastatur
Zitat:
Was meinst du mit Windowsstyle ?
Delphi-Quellcode:
Gruß, bluescreen25
var
Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin SetWindowPos(self.Handle, HWND_NOTOPMOST + WORD(true), 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); end; procedure TForm1.SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin windows.SetForegroundWindow(hForeground); windows.keybd_event(ord('A'), 0, 0, 0);//Beispiel end; procedure TForm1.SpeedButton1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); begin hForeground := windows.GetForegroundWindow; end; procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin windows.SetForegroundWindow(hForeground); end; |
Re: einfache Bildschirmtastatur
windows.SetActiveWindow(hForeground); sowie hForeground := windows.GetActiveWindow;
sind so wie ich es getestet habe , die bessere Wahl, dabei ist der Focus noch nicht wieder sporalisch auf die Bildschirmtastatur-Form gelangt. MfG bluescreen25 |
Re: einfache Bildschirmtastatur
So müsste es auch gehen:
Delphi-Quellcode:
Getestet unter WinXP
procedure TForm1.FormCreate(Sender: TObject);
begin //sowas hier meinte SirThornberry bestimmt SetWindowLong(handle, GWL_EXSTYLE,GetWindowLong(handle, GWL_EXSTYLE) or WS_EX_NOACTIVATE); SetWindowPos(self.Handle, HWND_NOTOPMOST + WORD(true), 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE); end; procedure TForm1.SpeedButton1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin keybd_event(ord('A'), 0, 0, 0);//Beispiel end; procedure TForm1.SpeedButton1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin keybd_event(ord('A'), 0, KEYEVENTF_KEYUP, 0); end; |
Re: einfache Bildschirmtastatur
Zitat:
|
AW: einfache Bildschirmtastatur
Wunderbar, wunderbar, Dankedankedanke :) das habe ich gesucht :) ihr seit klasse ;)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz