AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

einfache Bildschirmtastatur

Ein Thema von bluescreen25 · begonnen am 9. Apr 2007 · letzter Beitrag vom 20. Feb 2012
Antwort Antwort
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#1

einfache Bildschirmtastatur

  Alt 9. Apr 2007, 17:40
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#2

Re: einfache Bildschirmtastatur

  Alt 10. Apr 2007, 01:28
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;
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: einfache Bildschirmtastatur

  Alt 10. Apr 2007, 08:34
Zitat von bitsetter:
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;

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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#4

Re: einfache Bildschirmtastatur

  Alt 10. Apr 2007, 08:38
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: einfache Bildschirmtastatur

  Alt 10. Apr 2007, 09:31
Zitat von SirThornberry:
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)
Das verstehe ich jetzt nicht, egal was ich auf der Form platziere, irgendwann bekommt die Form den Focus, nicht nach dem ersten Klick, aber undeffinierbar bei xten Click.....oft wenn ich schnell hintereinander auf den Button clicke...

Was meinst du mit Windowsstyle ?

Delphi-Quellcode:
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;
Gruß, bluescreen25
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: einfache Bildschirmtastatur

  Alt 10. Apr 2007, 11:39
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
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: einfache Bildschirmtastatur

  Alt 10. Apr 2007, 11:55
So müsste es auch gehen:
Delphi-Quellcode:
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;
Getestet unter WinXP
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
bluescreen25

Registriert seit: 27. Nov 2005
Ort: Geldern
229 Beiträge
 
Delphi 7 Enterprise
 
#8

Re: einfache Bildschirmtastatur

  Alt 10. Apr 2007, 16:04
Zitat von bitsetter:
So müsste es auch gehen:
Delphi-Quellcode:
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;
Getestet unter WinXP
funktioniert prima, besten Dank !
...und ich dachte, Delphi ist ein Programmgenerator mit nur einem Button......tzzz
  Mit Zitat antworten Zitat
mkrasselt1

Registriert seit: 14. Feb 2011
3 Beiträge
 
#9

AW: einfache Bildschirmtastatur

  Alt 20. Feb 2012, 22:07
Wunderbar, wunderbar, Dankedankedanke das habe ich gesucht ihr seit klasse
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:32 Uhr.
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