Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Вниз

Mutex   Найти похожие ветки 

 
вп   (2005-11-04 09:17) [0]

Вопрос такого характера: использую мютекс для предотвращения повторной загрузки приложения... Можно ли (и как, если возможно) сделать так, что бы второй экземпляр приложения не просто выдавал сообщение , о том, что уже запущена копия данного приложения, но и активировал(переводил фокус) на запущенную копию..


 
Чапаев ©   (2005-11-04 09:46) [1]

В советах Валентина Озерова точно было. Поищи.


 
gdaujk ©   (2005-11-04 13:05) [2]

Я делаю так:


program YourProgram;

var
 UniqueMes: Integer;
 hMutex: THandle;

const
 UNIQUE_APP_STR = "Your_Very_Unique_App_Str";

{WinMain}

function YourMainWndProc(aWND: HWND; aMsg: Integer; aWParam: WPARAM; aLParam: LPARAM): Integer; stdcall;
 
 procedure ForceForegroundWindow();
 var
   fPID, cPID: DWORD;
 begin
   fPID := GetWindowThreadProcessId(GetForegroundWindow, nil);
   cPID := GetWindowThreadProcessId(MainWnd, nil);
   AttachThreadInput(fPID, cPID, True);
   ShowWindow(MainWnd, SW_SHOW);
   SetForegroundWindow(MainWnd);
   AttachThreadInput(fPID, cPID, False);
 end;

begin
  Result := 0;
  if aMsg = UniqueMes then  ForceForegroundWindow;

 case aMsg of
 //
 else
     Result := DefWindowProc(aWND, aMsg, aWParam, aLParam);
 end
end;

begin
 UniqueMes := RegisterWindowMessage(UNIQUE_APP_STR);
 hMutex := CreateMutex(nil, False, UNIQUE_APP_STR);
 if GetLastError = ERROR_ALREADY_EXISTS then
   begin
     PostMessage(HWND_BROADCAST, UniqueMes, 0, 0);
     Exit;
   end;
 //your code
end;


Процедура ForceForegroundWindow позволяет вывести окно первого экземпляра приложения на передний план, а не просто заставить кнопку на панели задач мигать.

PS: Всё вышеописанное проверялось только на XP...


 
вп   (2005-11-09 09:35) [3]

А что такое MainWnd ? =YourMainWndProc?


 
cp.Silver ©   (2005-11-09 16:51) [4]

Вот рабочий пример:

делаешь отдельный unit:

unit check;

interface

implementation

uses
 Windows;

var
 Mutex: THandle;
 MutexName: array[0..255] of Char;

function StopLoading: Boolean;
var
 l, i: integer;
begin
 l:= GetModuleFileName(MainInstance, MutexName, SizeOf(MutexName));
 for i:= 0 to l - 1 do
   if MutexName[i] = "\" then
   begin
     MutexName[i]:= "/";
   end;
 Mutex:= CreateMutex(nil, False, MutexName);

 Result:= (Mutex = 0) or (GetLastError = ERROR_ALREADY_EXISTS);
end;

initialization
 if StopLoading then halt;

finalization
 if Mutex <> 0 then CloseHandle(Mutex);

end.


И затем модифицируешь свой файл проекта (dpr):


program InControl;

uses
 Windows,
 check,
 Forms,
 main in "main.pas" {frmMain};

{$R *.RES}

begin
   Application.Initialize;
   Application.CreateForm(TfrmMain, frmMain);
   Application.Run;
end.


 
gdaujk ©   (2005-11-09 17:26) [5]

вп   (09.11.05 09:35) [3]
Да.

cp.Silver ©   (09.11.05 16:51) [4]
Неплохо, если ещё где-нибудь добавить вызов

procedure ForceForegroundWindow();

чтоб "фокус" перевести...


 
Leonid Troyanovsky ©   (2005-11-09 17:30) [6]


> вп   (04.11.05 09:17)  
> Вопрос такого характера: использую мютекс для предотвращения
> повторной загрузки приложения... Можно ли (и как, если возможно)
> сделать так, что бы второй экземпляр приложения не просто
> выдавал сообщение , о том, что уже запущена копия данного
> приложения, но и активировал(переводил фокус) на запущенную
> копию..


Для этого нужен уже не мьютекс, а, по-крайней мере, семафор,
чтобы хранить значение хендла окна (приложения).

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2005.11.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.013 c
14-1130944183
copy
2005-11-02 18:09
2005.11.27
String->integer


3-1129097530
erika
2005-10-12 10:12
2005.11.27
получении значения по дополнительной таблице


4-1127749490
Ejik
2005-09-26 19:44
2005.11.27
ловушки на открытие фалов и каталогов


14-1130915105
boalse
2005-11-02 10:05
2005.11.27
Компьютерный ажиотаж.


2-1131647329
dj0n
2005-11-10 21:28
2005.11.27
Отчеты для БД.





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский