Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
4-85304
olafpalmer
2002-06-21 16:19
2002.08.26
RichEdit 3.0


1-85015
A7exander
2002-08-16 10:49
2002.08.26
Как это сделать программно (dock)


3-84908
Mars
2002-08-06 17:16
2002.08.26
Что за ошибка -


1-85026
Chinas
2002-08-16 14:48
2002.08.26
Немогу вызвать fsMDIForm и fsMDIChild из DLL


7-85266
Alex-A
2002-06-14 10:30
2002.08.26
Как узнать размер папки?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский