PDA

View Full Version : Forcing focus



aidave
20-03-2006, 04:48 PM
Is there any way to force the focus of a form?

When my game starts up,
and you click on another window while its loading,
I try "SetFocus"
but the focus still stays on the other window.

jdarling
20-03-2006, 06:11 PM
This is actually quite a bit of a tricky task to pull off. In most cases you can get away with the following (but not all):

procedure ForceFocus(AForm:TForm);
begin
Application.SetFocus;
Application.Focus(AForm);
Application.BringToFront;
AForm.BringToFront;
end;

I may have a mis-type in there, as normal I'm working w/o a net (IDE). The idea is there. Note that this will not fix the modal issues in Windows XP, that requires another hack all together.

aidave
20-03-2006, 07:06 PM
Interesting, i just tried it, but didnt work.
I am using XP, I'm guessing XP tries to stop this activity.

Its really just an issue when developing,
having the IDE on my second monitor and switching.
But then my app strangles the mouse away..
yet the app stays unfocused!


these:
Application.SetFocus;
Application.Focus(AForm);
dont work in d7

these:
Application.BringToFront;
AForm.BringToFront;
make it glow orange in XP :lol:


thanx
dave

LP
21-03-2006, 05:57 PM
Few years ago I've used the following function (found somewhere on Internet). Let me know if it works:


function ForceForegroundWindow(hwnd: THandle): Boolean;
const
SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;

var
ForegroundThreadID: LongWord;
ThisThreadID: LongWord;
timeout: LongWord;
begin
if (IsIconic(hwnd)) then
ShowWindow(hwnd, SW_RESTORE);

if (GetForegroundWindow = hwnd) then
begin
Result:= True;
Exit;
end;

// Windows 98/2000 doesn't want to foreground a window when some other
// window has keyboard focus
if ((Win32Platform = VER_PLATFORM_WIN32_NT)and(Win32MajorVersion > 4))or
((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and
((Win32MajorVersion > 4) or ((Win32MajorVersion = 4) and
(Win32MinorVersion > 0)))) then
begin
// Code from Karl E. Peterson, www.mvps.org/vb/sample.htm
// Converted to Delphi by Ray Lischner
// Published in The Delphi Magazine 55, page 16
Result:= False;
ForegroundThreadID:= GetWindowThreadProcessID(GetForegroundWindow, nil);
ThisThreadID:= GetWindowThreadPRocessId(hwnd, nil);
if (AttachThreadInput(ThisThreadID, ForegroundThreadID, True)) then
begin
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hwnd);
AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
Result:= (GetForegroundWindow = hwnd);
end;

if (not Result) then
begin
// Code by Daniel P. Stasinski
SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @timeout, 0);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0), SPIF_SENDCHANGE);
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hWnd);
SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(timeout), SPIF_SENDCHANGE);
end;
end else
begin
BringWindowToTop(hwnd); // IE 5.5 related hack
SetForegroundWindow(hwnd);
end;

Result:= (GetForegroundWindow = hwnd);
end;


Just use it like: ForceForegroundWindow(Form1.Handle);

User137
21-03-2006, 10:03 PM
:lol: "Code of hell" for simple task.. oh well, if need is desperate..