Форум: "Основная";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];
Внизпрога проге Найти похожие ветки
← →
Дмитрий Иванов (2002-08-15 03:25) [0]Всем доброй ночи!
В программе есть проверка - запущена она уже или нет. Если она уже была запущена, то над надо сделать:
если она находится в 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 10:43) [1]???????????
← →
Smithson (2002-08-15 11:03) [2]Это особенность реализации Windows 98-2000-ME-XP. Так и должно быть - на передний план не выхот, а мигает.
← →
Ученик (2002-08-15 11:18) [3]Необходимо использовать AttachThreadInput, это пример по таймеру
procedure TForm1.Timer1Timer(Sender: TObject);
var
hForeGround : HWnd;
begin
hForeGround := GetForegroundWindow;
AttachThreadInput(GetWindowThreadProcessId(hForeGround, nil),
GetWindowThreadProcessId(Handle, nil), True);
SetForegroundWindow(Handle);
end;
← →
Дмитрий Иванов (2002-08-15 16:34) [4]Но не всё получается как надо:((
Если окно не минимизировано или в трее, то на передний план выходит, за что спасибо Ученику, а вот если минимизировано, то какая-то непонятная проблема, пишу:
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 16:50) [5]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 17:10) [6]СПАСИБО!!!!!!!!!!!!
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.005 c