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.