Results 1 to 5 of 5

Thread: Forcing focus

  1. #1

    Forcing focus

    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.

  2. #2

    Forcing focus

    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):

    [pascal]procedure ForceFocus(AForm:TForm);
    begin
    Application.SetFocus;
    Application.Focus(AForm);
    Application.BringToFront;
    AForm.BringToFront;
    end;[/pascal]

    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.

  3. #3

    Forcing focus

    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

  4. #4

    Forcing focus

    Few years ago I've used the following function (found somewhere on Internet). Let me know if it works:
    Code:
    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);

  5. #5

    Forcing focus

    :lol: "Code of hell" for simple task.. oh well, if need is desperate..

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •