AGB  ·  Datenschutz  ·  Impressum  







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

Focus auf externen prozess setzen

Ein Thema von KodeZwerg · begonnen am 22. Jan 2022 · letzter Beitrag vom 22. Jan 2022
Antwort Antwort
Benutzerbild von KodeZwerg
KodeZwerg

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

Focus auf externen prozess setzen

  Alt 22. Jan 2022, 16:40
wie der name bereits andeuten lässt, würde ich gerne in meiner applikation einer anderen den fokus/die eingabe geben und frage mich ob es so richtig ist bzw wie es richtig gemacht wird.

hier ist mein momentaner code
Delphi-Quellcode:
function Foobar(const TargetWindow: HWND = 0): Boolean;
var
  OldFocus: HWND;
  TargetThreadID: Cardinal;
begin
  Result := False;
  OldFocus := GetFocus;
  if (TargetWindow = 0) then
    Exit;
  TargetThreadID := GetWindowThreadProcessId(TargetWindow, nil);
  AttachThreadInput(GetCurrentThreadId, TargetThreadID, True);
  SetFocus(TargetThreadID);

  // hier wird mehr code ausgeführt während der andere prozess den fokus hat

  Result := (SetFocus(OldFocus) <> 0);
end;
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#2

AW: Focus auf externen prozess setzen

  Alt 22. Jan 2022, 17:11
Zitat:
SetFocus(TargetThreadID);
Das kann erstmal absolut garnicht gehn.
ThreadID (nichtmal ein ThreadHandle) <> WindowHandle

Wieso kommt niemand auf die Idee mal die absolut irrsinnige Idee die Rückgabewerte zu prüfen, wenn er wissen will, ob was ging, bzw. richtig war?

Falls das Letzte SetFocus(OldFocus) erfolgreich wäre, dann war alles vorher sinnlos.
Wenn, dann eher so Result := GetFocus = TargetWindow; .

Und man könnte auch mal die Hilfe lesen?
Zitat von MSDN: SetFocus:
Sets the keyboard focus to the specified window. The window must be attached to the calling thread's message queue.
Was ja wohl nicht der Fall sein wird.



Dein Programm hat aktuell (vor Aufruf) den Fokus?
Wenn nicht, dann wird's eh nichts. (außer du nutzt noch ein XP oder älter)


Delphi-Quellcode:
procedure Foobar(TargetWindow: HWND = 0);
var
  TargetThreadID: Cardinal;
begin
  if TargetWindow = 0 then
    raise Exception.Create('Foobar: invalid HWND'): //Exit(False);
  TargetThreadID := GetWindowThreadProcessId(TargetWindow, nil);
  if not AttachThreadInput(GetCurrentThreadId, TargetThreadID, True) then
    RaiseLastOSError;
  if SetFocus(TargetWindow) = 0 then
    RaiseLastOSError;
end;


Ich würde es ja eher mit SetForegroundWindow
oder SetActiveWindow/GetActiveWindow
und eventuell noch BringWindowToTop versuchen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Jan 2022 um 17:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Focus auf externen prozess setzen

  Alt 22. Jan 2022, 23:34
Ja das mit SetFocus() da hatte ich vorschnell getippt, bei mir war es bereits kurz nachdem ich es gepostet hatte gefixed.

Vielen Dank das Du Dir die Zeit genommen hast.
Ich werde nun alles nochmal durchlesen und mich bessern!

Ja, mein Programm hat zu beginn den Fokus, man muss einen Knopf drücken dann soll eine andere Anwendung den Fokus erhalten.
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 04:55 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