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
EWeiss
(Gast)

n/a Beiträge
 
#1

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
 
#2

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
EWeiss
(Gast)

n/a Beiträge
 
#3

AW: Anderem Program den Fokus übergeben

  Alt 8. Jul 2018, 01:20
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.
Ach wenn es gehen mag es ist falsch.
Danke nein ich möchte es nicht testen ich weis wie der richtige weg sein muss, aber streiten deswegen tue ich mich auch nicht.

EDIT:
Zitat:
GetParent stellt sicher das ich kein Control erwische sondern ein Fensterhandle.
Sorry dazu sage ich mal besser nichts.
Ok! Was willst du eigentlich erreichen du möchtest den Focus des aktiven Fensters.
1. Mit deiner Funktion wirst du nicht immer.. ich meine Immer den Focus des aktiven Fensters erhalten.
2. Was soll das?
  if GetParent(GetForegroundWindow) = 0 then lHwnd := GetForegroundWindow else lHwnd := GetParent(GetForegroundWindow);
Entweder ich will den Focus der Anwendung oder nicht was soll also das
else lHwnd := GetParent(GetForegroundWindow);
Das ist nicht das gewünschte Resultat.

Wenn also GetForegroundWindow 0 zurück liefert dann ist es eben so! Da gibt es kein "else" weil uninteressant!
3. Wenn du garantieren willst das der aktive Prozess ein garantiertes Window Handle zurück liefert dann musst du den jeweiligen Prozess Attachen
tust du es nicht dann vergiss es einfach das andere ist nur Spielerei.

gruss

Geändert von EWeiss (11. Jul 2019 um 16:52 Uhr)
  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, 01:54
Okay ich sehe meinen Fehler ein das diese Methode nicht 100% akkurat arbeitet, ich hätte es tiefer testen sollen, bei mir kam nur TC und WindowsExplorer bis jetzt in Frage da ichs in der Autostart-Abteilung verarbeitet habe. Nun dank dieses Buttons kann ich auch das testen.
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  oldHWND: HWND;
begin
  Hide;
  if GetParent(GetForegroundWindow) = 0 then oldHWND := GetForegroundWindow else oldHWND := GetParent(GetForegroundWindow);
  mmo1.Lines.Add('oldHWND: '+IntToStr(oldHWND)+' - '+IntToHex(oldHWND,8));
  Show;
end;
edit
2. Was soll das?
Mit der ersten Abfrage teste ich ob ich GetParent brauche oder ob GetForegroundWindow bereits das Parent (Hauptfenster) Window ist.
Aber mit Deinen .exes funktioniert es so nicht da alles falsch ist.
Gruß vom KodeZwerg

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

n/a Beiträge
 
#5

AW: Anderem Program den Fokus übergeben

  Alt 8. Jul 2018, 01:55
Okay ich sehe meinen Fehler ein das diese Methode nicht 100% akkurat arbeitet, ich hätte es tiefer testen sollen, bei mir kam nur TC und WindowsExplorer bis jetzt in Frage da ichs in der Autostart-Abteilung verarbeitet habe. Nun dank dieses Buttons kann ich auch das testen.
Delphi-Quellcode:
procedure TForm1.btn1Click(Sender: TObject);
var
  oldHWND: HWND;
begin
  Hide;
  if GetParent(GetForegroundWindow) = 0 then oldHWND := GetForegroundWindow else oldHWND := GetParent(GetForegroundWindow);
  mmo1.Lines.Add('oldHWND: '+IntToStr(oldHWND)+' - '+IntToHex(oldHWND,8));
  Show;
end;
vergiss das!
else oldHWND := GetParent(GetForegroundWindow);
Ist unnötig!
Zitat:
bereits das Parent (Hauptfenster) Window ist.
Das Hauptfenster kann niemals das Parent sein! Ein HauptFenster(AnwendungsFenster) ist kein ChildWindow deshalb läuft das immer ins leere.
Bsp. Ein Button auf der Hauptform ist ein ChildWindow von diesem ist das Parent dein HauptFenster und was ist das Parent nun von diesen?

Zitat:
Aber mit Deinen .exes funktioniert es so nicht da alles falsch ist.
Habe kein EXE hochgeladen..
Habe nur aufgezeigt wie der richtige weg ist es zwingt dich aber niemand das nachzuverfolgen
Ok bin raus.. Wie ich schon sagte macht wie ihr wollt.

gruss

Geändert von EWeiss ( 8. Jul 2018 um 02:14 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, 02:37
Delphi-Quellcode:
procedure MySetForegroundWindow(Wnd: HWND);
var
  Attached: Boolean;
  ThreadId: DWORD;
  FgWindow: HWND;
  AttachTo: DWORD;
begin
{ Emils Rezept verlangt
GetForegroundWindow
GetWindowThreadProcessId
AttachThreadInput (true)
GetFocus <- ich nahm SetFocus, mit GetFocus wusste ich nichts mit anzufangen, bitte um hilfe dabei
AttachThreadInput (false)
hoffentlich ist es so ok
}

  Attached := False;
  ThreadId := GetCurrentThreadId; // unsere .exe
  FgWindow := GetForegroundWindow(); // aktuelles Foreground
  AttachTo := GetWindowThreadProcessId(FgWindow, nil);
  if (AttachTo <> 0) and (AttachTo <> ThreadId) then
   if AttachThreadInput(ThreadId, AttachTo, True) then
     begin
       Attached := Windows.SetFocus(Wnd) <> 0; // Focus setzen
       AttachThreadInput(ThreadId, AttachTo, False); // connect lösen
     end;
  if not Attached then
     begin
       SetForegroundWindow(Wnd); // SetForeground ausführen
       SetFocus(Wnd); // Focussieren
     end;
end;
Zumindest ist alles vom Rezept enthalten, bin auch am Ende damit.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: Anderem Program den Fokus übergeben

  Alt 8. Jul 2018, 05:24
Ohne gewähr..
Nur getippt nicht getestet.

Delphi-Quellcode:
function GetFocusHandle: HWND;
var
  ForegroundHandle: HWND;
  PID: DWord;
  myThreadID: DWord;
begin

  // Meine ThreadID
  myThreadID := GetCurrentThreadId;
  // Hole das Handle vom Top Level Vordergrund Window
  ForegroundHandle := GetForegroundWindow;
  // Process ID vom Vordergrund Window einlesen
  PID := GetWindowThreadProcessId(ForegroundHandle, nil);
  // diesen Thread und den fremden Thread zusammen fügen
  AttachThreadInput(myThreadID, PID, true);
  // Das Focus Handle
  Result := GetFocus;
  // Threads von einander trennen in dem ich beim dritten wert false übergebe
  AttachThreadInput(myThreadID, PID, false);
end;
man könnte das ganze jetzt noch in einem Loop packen..

Delphi-Quellcode:
  doloop := not doloop;
  repeat
    FocusHwnd := GetFocusHandle;
    application.ProcessMessages;
    Label1.Caption := IntToStr(FocusHwnd);
    Sleep(10)
  until doloop = false;
Nun solltest du mit SetFocus(FocusHwnd) den alten Stand wieder zurück setzen können.
Du kannst aber auch eine Procedure erstellen und verwendest dann anstelle von
Result := GetFocus;
SetForegroundWindow(ForegroundHandle);

Es muss sich aber innerhalb der beiden AttachThreadInputs befinden.
Wenn es jetzt fehlschlägt als Beispiel bei Windows Explorer Ordnern dann kannst du das Parent ermitteln um an das Fensterhandle zu kommen.
Denn hier wird der Focus immer auf das DirectUIHWND gesetzt ist zumindest bei Win7 so.

Bin jetzt aber wirklich raus!
Muss an meinem transparenten TabControl weiterarbeiten.

gruss

Geändert von EWeiss ( 8. Jul 2018 um 06:05 Uhr)
  Mit Zitat antworten Zitat
rinolduz

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

AW: Anderem Program den Fokus übergeben

  Alt 11. Jul 2018, 19:35
Danke ersteinmal für die ganzen Antworten!

Habe es inzwischen mit
Code:
GetWindowThreadProcessId
hinbekommen!
  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 06:09 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