Главная страница
    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.012 c
2-1131432230
kami
2005-11-08 09:43
2005.11.27
Ошибка 1048


8-1120357045
Канвас
2005-07-03 06:17
2005.11.27
Как сделать Canvas.CopyRect для наклонной области ?


14-1130948774
Erl
2005-11-02 19:26
2005.11.27
статистика


14-1131004749
cmd help
2005-11-03 10:59
2005.11.27
Как слить несколько файлов в один?


14-1131439663
Vanya95
2005-11-08 11:47
2005.11.27
Быстрый перенос настроек одной уч.записи в другую в Windows XP





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