Конференция "WinAPI" » Вынести окно на первый план
 
  • TStas (12.10.09 19:47) [0]
    Окно - блокнот виндов.  

    NotePadHandle := FindWindow('notepad', 'Áåçûìÿííûé - Áëîêíîò');

     If NotePadHandle = 0 then //Íåòó?
       // - Äà, íåòó, ñîçäàþ
       NotePadHandle := WinExec('Notepad', SW_SHOW)
     else
       Begin
       SetForegroundWindow(NotePadHandle);
       End;

    Всё работает, пока блокнот не свернули. А вот свёрнутый не хочет разворачиваться и всё.
    Это не критично важно, но любопытно. Читал в одной книжке, что так и должно быть.
  • CrytoGen (12.10.09 19:50) [1]
    ShowWindow с SW_RESTORE попробуй
  • clickmaker © (14.10.09 09:55) [2]
    > ShowWindow с SW_RESTORE попробуй

    + IsIconic()
  • DVM © (14.10.09 14:59) [3]

    function ForceForegroundWindow(hWnd: HWND): BOOL;
    const
     SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
     SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
    var
     OsVerInfo: TOSVersionInfo;
     Win32MajorVersion: Integer;
     Win32MinorVersion: Integer;
     Win32Platform: Integer;
     ForegroundThreadID: DWORD;
     ThisThreadID: DWORD;
     Timeout: DWORD;
    begin
     OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
     GetVersionEx(osVerInfo);
     Win32MajorVersion := OsVerInfo.dwMajorVersion;
     Win32MinorVersion := OsVerInfo.dwMinorVersion;
     Win32Platform := OsVerInfo.dwPlatformId;
     if IsIconic(hWnd) then ShowWindow(hWnd, SW_RESTORE);
     if GetForegroundWindow = hWnd then Result := True
     else
     begin
       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);
           SetForegroundWindow(hWnd);
           AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
           Result := (GetForegroundWindow = hWnd);
         end;
         if not Result then
         begin
           SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @Timeout, 0);
           SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, nil, SPIF_SENDCHANGE);
           BringWindowToTop(hWnd);
           SetForegroundWindow(hWnd);
           SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, @Timeout, SPIF_SENDCHANGE);
         end;
       end
       else
       begin
         BringWindowToTop(hWnd);
         SetForegroundWindow(hWnd);
       end;
       Result := (GetForegroundWindow = hWnd);
     end;
    end;

  • TStas (14.07.10 23:35) [4]
    Спасибо. Вот именно то, что нужно, ибо срабатывает и при свёрнутом окне, чего у меня никак не иполучалось, в т. ч. с использованием сооветов из книжки.
  • Anatoly Podgoretsky © (15.07.10 09:48) [5]
    > clickmaker  (14.10.2009 09:55:02)  [2]

    Не для того его сворачивали.
  • TStas (15.07.10 13:25) [6]
    Да сворачиваю его я же сам, чтобы не мешалось. Спасибо ещё раз.
 
Конференция "WinAPI" » Вынести окно на первый план
Есть новые Нет новых   [134431   +10][b:0][p:0.002]