Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как сделать приложение активным ?! [D7, WinXP]


AKA ©   (2004-10-15 02:13:00) 

Как сделать приложение активным т.е. чтобы его окно было поверх всех других если запустить его так:

if CreateProcess(nil,PChar('test.exe'),nil,nil,False,0,nil,PChar('c:\'),SI,PI)


AKA   (2004-10-16 21:46:00) [1]

НАКОНЕЦ-ТО работает !!!
ОГРОМНОЕ СПАСИБО тебе DDA !!!

Суть программы следущая:
Запускаю свою программу она проверяет себя на наличие в памяти если нет то остается работать, если есть то передает сообщение первой программе которая должна всплыть и стать активной, а вторая копия завершает свою работу !!!

Еще раз ОГРОМНОЕ СПАСИБО !!!


DDA   (2004-10-16 16:27:00) [2]

тебе поможет вот это,точно


//-------------------------------
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
    // 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;
end; { ForceForegroundWindow }
//-----------------------------------------
procedure TForm1.Timer1Timer(Sender: TObject);
begin
 ForceForegroundWindow(Application.Handle);
end;


GanibalLector   (2004-10-16 02:03:00) [3]

Работает только это
Не верю.
Вы [6] пробовали ???


AKA   (2004-10-16 01:09:00) [4]

Вот список функций и сообщений которые я применял ничего не помогло !!
В лучшем случае мигал заголовок окна и все !!!

si.wShowWindow:=sw_show;
PostMessage (Handle, WM_SYSCOMMAND, SC_restore, 0);
BringWindowToTop(Handle);
si.dwFlags := STARTF_RUNFULLSCREEN;
si.wShowWindow := 4;
ARC30.Enabled:=true;
FlashWindow(Handle,true);
Showwindow(Handle,sw_show);
SetWindowPos(Handle,HWND_BOTTOM,1,1,200,200,SWP_SHOWWINDOW );
PostMessage(Handle, WM_ACTIVATE, 0, 0);
ShowWindow(Handle, SW_RESTORE);
SendMessage(Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
SendMessage(Handle, WM_ACTIVATE, WA_CLICKACTIVE, 0);
BringWindowToTop(Handle);
SetForegroundWindow(.Handle);
SendMessage(Handle,WM_LButtonDown,1,1);
SendMessage(Handle,WM_LButtonUP,1,1);
SendMessage(Handle, WM_ACTIVATEAPP, 0, 0);
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE + SWP_NOMOVE);

Работает только это:
Application.Minimize;
Application.Restore;
Application.BringToFront;

Ниужеле нет никакого способа !???


GanibalLector   (2004-10-15 20:10:00) [5]

Во,так :

var QQ:HWND;
begin
QQ:=findwindow('SciCalc',nil);
if GetForegroundWindow<>QQ then SetForegroundWindow(QQ);
end;


GanibalLector   (2004-10-15 20:08:00) [6]

2 GanibalLector  [4]
Ошибся,пардон


GanibalLector   (2004-10-15 20:00:00) [7]

>Как сделать приложение активным ?
if GetActiveWindow<>некоторый HWND then SetActiveWindow(некоторый HWND);


AKA   (2004-10-15 19:38:00) [8]

Вот нашел такой вариант

Application.Minimize;
Application.Restore;
Application.BringToFront;

работает - но не устраивает то что окно сначало сворачивается ???

Есть у кого еще какие-нибудь версии ???


AKA   (2004-10-15 18:50:00) [9]

Ну или как реализовать такой вариант ?
Программа по таймеру должна становиться активной т.е. чтобы окно программы было поверх всех окон и имела фокус ???


AKA   (2004-10-15 18:47:00) [10]

Блин пробовал разными способами:

PostMessage(Handle, WM_ACTIVATE, 0, 0);
SendMessage(Handle, WM_ACTIVATE, WA_CLICKACTIVE, 0);
BringWindowToTop(Handle);

вот еще одно сообщение WM_ACTIVATEAPP в ее параметр входит hThread может с помощью его как ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо