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