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

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

прога проге


Дмитрий Иванов ©   (2002-08-15 03:25:00) 

Всем доброй ночи!
В программе есть проверка - запущена она уже или нет. Если она уже была запущена, то над надо сделать:
если она находится в SystemTray"е, вытащить оттуда и вывести на передний план;
если минимизирована сделать RESTORE и вывести на передний план;
в другом случае просто вывести на передний план;

Делаю так

program M;

uses
Windows, Forms, Messages,
main in "main.pas" {Form1};

{$R *.RES}

function EnumProc(Wd: HWnd; Param: LongInt): Boolean; stdcall;
var
Nm:Array[0..255] of Char;
begin
EnumProc := True;
if isWindow(WD) then
begin
GetWindowText(Wd,Nm,255);
if lStrCmp(Nm,PChar("Form1"))=0 then
begin
SendMessage(WD,WM_SECONDSTART,0,0);
EnumProc := False;
end;
end
end;


const AppID="abcdefghjkllkjhgfedcba";
var Handle:THandle;
begin
Handle:=CreateFileMapping($FFFFFFFF,nil,PAGE_READONLY,0,1,AppID);
if GetLastError=ERROR_ALREADY_EXISTS then
EnumWindows (@EnumProc, 0)
else
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run
end;
CloseHandle(Handle)
end.

============================================

в main.pas"е
...
const
WM_SECONDSTART = WM_USER + 113;

....

TForm1=Class(TOBject)
...
procedure WMSECONDSTART(var Msg: TMessage); message WM_SECONDSTART;
...
end;

....

procedure TForm1.WMSECONDSTART(var Msg: TMessage);
begin
if not isWindowVisible(Handle) then
SendMessage(Handle,WM_ICONNOTIFY,100,WM_LBUTTONDBLCLK) //достаем из трея (это работает!!!)
else
if isIconic(Handle) then ShowWindow(Handle,SW_RESTORE);//не работает!!!
BringWindowToTop(Handle);//не выводит на передний план!!!
end;

...

Если окно не минимизировано, и не в трэе, то оно не выходит на первый план, а только мигает в TaskBar"е, а если минимизировано то, почему-то isIconic(Handle) дает False, а not isWindowVisible(Handle) дает True!!! Подскажите, плиз, что я делаю не так.


Дмитрий Иванов   (2002-08-15 17:10:00) [1]

СПАСИБО!!!!!!!!!!!!


Ученик   (2002-08-15 16:50:00) [2]

procedure TForm1.Timer1Timer(Sender: TObject);
var
hForeGround : HWnd;
begin
hForeGround := GetForegroundWindow;
AttachThreadInput(GetWindowThreadProcessId(hForeGround, nil),
GetWindowThreadProcessId(Handle, nil), True);
if IsIconic(Application.Handle) then
Application.Restore
else
SetForegroundWindow(Handle);
end;


Дмитрий Иванов   (2002-08-15 16:34:00) [3]

Но не всё получается как надо:((
Если окно не минимизировано или в трее, то на передний план выходит, за что спасибо Ученику, а вот если минимизировано, то какая-то непонятная проблема, пишу:

procedure TForm1.WMSECONDSTART(var Msg: TMessage);
var H:THandle;
begin
if not Visible then
SendMessage(Handle,WM_ICONNOTIFY,100,WM_LBUTTONDBLCLK)
else
begin
ShowWindow(Handle,SW_RESTORE);///???????????????
H:=GetForegroundWindow;
AttachThreadInput(GetWindowThreadProcessId(H, nil),
GetWindowThreadProcessId(Handle, nil), True);
SetForegroundWindow(Handle);
end;
end;

Так вот, окно то восстанавливается в прежнее состояние, только:
1. не выходит на передний план
2. его больше нельзя минимизировать!!! - нет никакой реакции при нажатии на кнопку "Свернуть"

Как быть?


Ученик   (2002-08-15 11:18:00) [4]

Необходимо использовать AttachThreadInput, это пример по таймеру

procedure TForm1.Timer1Timer(Sender: TObject);
var
hForeGround : HWnd;
begin
hForeGround := GetForegroundWindow;
AttachThreadInput(GetWindowThreadProcessId(hForeGround, nil),
GetWindowThreadProcessId(Handle, nil), True);
SetForegroundWindow(Handle);
end;


Smithson   (2002-08-15 11:03:00) [5]

Это особенность реализации Windows 98-2000-ME-XP. Так и должно быть - на передний план не выхот, а мигает.


Дмитрий Иванов   (2002-08-15 10:43:00) [6]

???????????


Наверх

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