zoukankan      html  css  js  c++  java
  • SetForegroundWindow API函数还不够(好多好多解决方案,真是奇思妙想)

    好多好多解决方案:

    var
      Input: TInput;
    begin
      ZeroMemory(@Input, SizeOf(Input));
      SendInput(1, Input, SizeOf(Input)); // don't send anyting actually to another app..
      SetForegroundWindow(Handle);

    I am doing something similar in one of my applications and this function works for me in xp/vista/w7:

    function ForceForegroundWindow(hwnd: THandle): Boolean;
    const
      SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
      SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
    var
      ForegroundThreadID: DWORD;
      ThisThreadID: DWORD;
      timeout: DWORD;
    begin
      if IsIconic(hwnd) then ShowWindow(hwnd, SW_RESTORE);
    
      if GetForegroundWindow = hwnd then Result := True
      else
      begin
        // 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
          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;
    end;

    Another solution is not to steal focus and just put the window TOPMOST in the z buffer:

    procedure ForceForegroundNoActivate(hWnd : THandle);
    
    begin
     if IsIconic(Application.Handle) then
      ShowWindow(Application.Handle, SW_SHOWNOACTIVATE);
     SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOMOVE);
     SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOACTIVATE or SWP_NOMOVE);
    end;
    Application.Restore; // unminimize window, makes no harm always call it
    SetWindowPos(self.Handle, HWND_NOTOPMOST,0,0,0,0, SWP_NOMOVE or SWP_NOSIZE);
    SetWindowPos(self.Handle, HWND_TOPMOST,0,0,0,0, SWP_NOMOVE or SWP_NOSIZE);
    SetWindowPos(self.Handle, HWND_NOTOPMOST,0,0,0,0, SWP_SHOWWINDOW or SWP_NOMOVE or SWP_NOSIZE);
    function WinActivate(const AWinTitle: string): boolean;
    var
      _WindowHandle: HWND;
    begin
      Result := false;
      _WindowHandle := FindWindow(nil, PWideChar(AWinTitle));
      if _WindowHandle <> 0 then
      begin
        if IsIconic(_WindowHandle) then
          Result := ShowWindow(_WindowHandle, SW_RESTORE)
        else
          Result := SetForegroundWindow(_WindowHandle);
      end;
    end;
    
    if WinActivate(self.Caption) then
      ShowMessage('This works for me in Windows 10');
    tmpFormStyle := Application.MainForm.FormStyle;
    Application.MainForm.FormStyle := fsStayOnTop;
    Application.Restore; // optional
    Application.BringToFront;
    Application.MainForm.FormStyle := tmpFormStyle;

    http://stackoverflow.com/questions/12946150/how-to-bring-my-application-to-the-front/20707637#20707637

  • 相关阅读:
    CAS与ABA问题产生和解决
    OnCheckedChangeListener和setChecked之间冲突问题解决
    【二】 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。
    【一】设计一个类,我们只能生成该类的一个实例。
    深入学习semaphore
    RF-For循环使用
    【RF库Collections测试】List Should Contain Value
    RF采用SSHLibary库执行sudo命令,提示sudo: sorry, you must have a tty to run sudo错误的解决办法
    【RF库Collections测试】List Should Contain Value
    RF判断列表、字典、整数、字符串类型是否相同方法
  • 原文地址:https://www.cnblogs.com/findumars/p/6361933.html
Copyright © 2011-2022 走看看