AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Anderem Program den Fokus übergeben
Thema durchsuchen
Ansicht
Themen-Optionen

Anderem Program den Fokus übergeben

Ein Thema von rinolduz · begonnen am 7. Jul 2018 · letzter Beitrag vom 11. Jul 2018
Antwort Antwort
rinolduz

Registriert seit: 7. Jul 2018
2 Beiträge
 
#1

Anderem Program den Fokus übergeben

  Alt 7. Jul 2018, 22:02
Guten Abend,

ich habe aktuell das Problem, dass ich gerne dem Fenster, welches vor
meiner Anwendung den Fokus hatte, den Fokus wieder zurück geben würde.
Gibt es dazu eine Möglichkeit?

Vielen Dank schonmal im Vorraus!
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Anderem Program den Fokus übergeben

  Alt 7. Jul 2018, 22:27
Hallo, ich würde mir mit GetForegroundWindow das alte/aktive Fenster merken und mit SetForegroundWindow setzen.
Da vielleicht auch mit GetParent arbeiten.

Hilft Dir das weiter?

Ps: Das "merken" würde ich in der .dpr Datei gleich hinter "Begin" machen und das "setzen" nachdem Deine Forms erstellt sind, falls es Vcl ist.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 7. Jul 2018 um 23:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von dummzeuch
dummzeuch

Registriert seit: 11. Aug 2012
Ort: Essen
1.666 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Anderem Program den Fokus übergeben

  Alt 7. Jul 2018, 23:27
Schwierig ist der Teil "merken Welches Programm vorher den Fokus hatte". Wenn man das Handle dieses Fensters hat, reicht

Delphi-Quellcode:
  GetWindowThreadProcessId(OtherHandle, pid);
  if pid = 0 then begin
    LogInfo('Process Id for Windows ' + _WndClass + ' not found');
    Exit;
  end;
  Res := AllowSetForegroundWindow(pid);
  if not Res then begin
    LogInfo('AllowSetForegroundWindow for ' + _WndClass + ' failed');
    Exit;
  end;
  Res := SetForegroundWindow(OtherHandle);
  if not Res then
    LogInfo('SetForegroundWindow for ' + _WndClass + ' failed');
Ich weiss allerdings nicht, wie man das vorher aktive Programm ermittelt. Evtl. einfach beim Start das Fenster im Vordergrund ermitteln? Oder vielleicht das, welches unter dem eigenen Fenster liegt?
Thomas Mueller
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Anderem Program den Fokus übergeben

  Alt 8. Jul 2018, 00:17
Also das mit dem ermitteln ist ein klacks.
  if GetParent(GetForegroundWindow) = 0 then lHwnd := GetForegroundWindow else lHwnd := GetParent(GetForegroundWindow); .
Diese Zeile in .dpr gleich hinter begin einfügen.
In der MainForm das hier einfügen
Delphi-Quellcode:
var
  FormX: TFormX;
  lHwnd: HWND;

...

procedure TFormX.FormActivate(Sender: TObject);
begin
  if not Win32Check(SetForegroundWindow(lHwnd)) then
    mmo1.Lines.Add('SetForegroundWindow failed');
end;
So funktioniert es genau so wie der TE es wollte.
Gruß vom KodeZwerg

Geändert von KodeZwerg ( 8. Jul 2018 um 01:12 Uhr) Grund: code optimiert
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: Anderem Program den Fokus übergeben

  Alt 8. Jul 2018, 01:13
Also das mit dem ermitteln ist ein klacks.
  if GetParent(GetForegroundWindow) = 0 then lHwnd := GetForegroundWindow else lHwnd := GetParent(GetForegroundWindow); .
Diese Zeile in .dpr gleich hinter begin einfügen.
In der MainForm das hier einfügen
Delphi-Quellcode:
var
  FormX: TFormX;
  lHwnd: HWND;

...

procedure TFormX.FormShow(Sender: TObject);
begin
  SetForegroundWindow(lHwnd);
end;
Das "setzen" klappt nicht obwohl korrektes Handle Anhang 49466. (Ich habe .exe aus dem TC heraus gestartet)
Vielleicht braucht man dafür mehr Rechte?
Und du glaubst das klappt so wie du denkst?
Du weist doch gar nicht welcher Prozess den Focus hat und ob das Handle das du einholst das des Aktiven Fensters ist.
Es kann genauso gut auch das eines Button des aktiven Fensters sein wenn dieser in der anderen Anwendung den Focus hat.

Ich würde so vorgehen.

GetForegroundWindow
GetWindowThreadProcessId
AttachThreadInput (true)
GetFocus
AttachThreadInput (false)

Die lösung von @dummzeuch ist schon näher dran
Was das mit dem GetParent soll müsstest du mir mal näher erläutern.

Aber gut macht mal

gruss

Geändert von EWeiss ( 8. Jul 2018 um 01:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Anderem Program den Fokus übergeben

  Alt 8. Jul 2018, 01:18
Hab eine funktionierende Variante geupdatet. Man könnte noch einen Test einfügen ob man DesktopHandle erwischt hat aber ansonsten macht es alles was der TE wollte.
Bitte teste und überzeuge Dich selbst, Danke.

edit
GetParent stellt sicher das ich kein Control erwische sondern ein Fensterhandle.
Gruß vom KodeZwerg
  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:35 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