![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Долгое время программа работала спокойно, без каких-либо проблем. Если её копия уже была запущена, то она успешно передавала ей управление и "умирала". Переписал программу с использованием АльфаСкинов, и тут начался каламбур - программа точно так же поднимает окно, если оно за чем-то спрятано, но вот в случае, если окно свёрнуто - развернуть его, как было раньше, не получается.
Использую вот такой фрагмент: Код:
var
PreviousInstanceWindow : LongWord;
begin
PreviousInstanceWindow := FindWindow('TfMain',nil);
if PreviousInstanceWindow <> 0 then begin
if IsIconic(PreviousInstanceWindow) then
ShowWindow(PreviousInstanceWindow,SW_RESTORE)
else
SetForegroundWindow(PreviousInstanceWindow);
Halt;
end;
Application.Initialize;
Application.CreateForm(TfMain, fMain);
Application.Run;
end;P.S. Вариант "не использовать скины" не рассматривается. |
|
#2
|
||||
|
||||
|
Попробуй вот такое решение:
Код:
var
Form1: TForm1;
PreviousInstanceWindow: THandle;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
if WaitForSingleObject(PreviousInstanceWindow, 0) <> 0
then begin
ShowWindow(PreviousInstanceWindow, SW_RESTORE);
Application.Terminate;
end
else SetForegroundWindow(PreviousInstanceWindow);
end;
initialization
PreviousInstanceWindow := CreateMutex(nil, True, 'DJ PhoeniX');
finalization
CloseHandle(PreviousInstanceWindow);
end. |
|
#3
|
||||
|
||||
|
Не будет оно работать...
![]() Да и проблемы не решит. Последний раз редактировалось PhoeniX, 17.01.2011 в 13:06. |
|
#4
|
||||
|
||||
|
Аргументируй
|
|
#5
|
||||
|
||||
|
1. Хендл мьютекса и хендл окна в данном случае - одно и то же? Что будет, если "восстановить окно" Мьютекса?
2. Проверка работает нормально, меня интересует, почему перестало восстанавливаться из трея окно после добавления альфы. |
|
#6
|
||||
|
||||
|
файл проекта:
Код:
program Project1;
uses
Windows, Messages,
Forms,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
PreviousInstanceWindow : LongWord;
begin
PreviousInstanceWindow := FindWindow('TfMain',nil);
if PreviousInstanceWindow <> 0 then begin
// if IsIconic(PreviousInstanceWindow) then
SendMessage(PreviousInstanceWindow, WM_USER, 0, 0);
// else
// SetForegroundWindow(PreviousInstanceWindow);
Halt;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.главная форма: Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
private
{ Private declarations }
procedure WMUSER(var Message: TMessage); message WM_USER;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
function SetForegroundWindow(AHandle: THandle): Boolean;
var
AWindow: THandle;
AThreadId: Cardinal;
AProcessId: Cardinal;
begin
AWindow:=GetForegroundWindow;
AThreadId:=GetCurrentThreadId;
AProcessId:=GetWindowThreadProcessId(AWindow, nil);
AttachThreadInput(AThreadId, AProcessId, True);
Result:=Windows.SetForegroundWindow(AHandle);
AttachThreadInput(AThreadId, AProcessId, False);
end;
{ TForm1 }
procedure TForm1.WMUSER(var Message: TMessage);
begin
if not Visible then Show;
ShowWindow(Application.Handle, SW_SHOW);
Application.Restore;
Application.BringToFront;
// SetForegroundWindow(Handle);
end;
end.только WM_USER+что-то, имхо |