Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Focus auf externen prozess setzen

  Alt 22. Jan 2022, 18: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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

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