Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Focus auf externen prozess setzen (https://www.delphipraxis.net/209790-focus-auf-externen-prozess-setzen.html)

KodeZwerg 22. Jan 2022 16:40

Focus auf externen prozess setzen
 
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;

himitsu 22. Jan 2022 17:11

AW: Focus auf externen prozess setzen
 
Zitat:

Delphi-Quellcode:
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
Delphi-Quellcode:
SetFocus(OldFocus)
erfolgreich wäre, dann war alles vorher sinnlos.
Wenn, dann eher so
Delphi-Quellcode:
Result := GetFocus = TargetWindow;
.

Und man könnte auch mal die Hilfe lesen?
Zitat:

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.

KodeZwerg 22. Jan 2022 23:34

AW: Focus auf externen prozess setzen
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:18 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