![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вторая копия программы ! [D7, NT4, Win2k, WinXP]
Конопелька © (2005-12-07 00:12:00)Здравтвуйте !
Подскажите пожалуйста исключение варианта запуска второй копии программы !! и что б при повторном запуске программы открывалось уже запущеное мое приложение ! у меня есть несколько примеров но они не совсем меня устраивают ! И подскажите обязательно ли для этого нужно знать название программы !и если его изменить получиться ли исключить запуск второй копии !
И тут же еще один вопрос к этой теме ! есть два приложение - первое простое с двумя кнопками (к примеру ) а второе имеет две формы ! и вот нужно что б по нажатию той или иной кнопки открывалось то или иное окно второй программы (уже запущеной) !
Заранее огромное спасибо за помощь ! ))
gdaujk (2005-12-07 22:47:00) [21]Leonid Troyanovsky © (07.12.05 18:44) [35]
С маппингами тоже сделал, в принципе оптимальный вариант. А кусок
if IsIconic(h) then
ShowWindow(h, SW_RESTORE);
SetForegroundWindow(h);
под Win98/ME точно будет работать?
PS: Зачем
SendMessage(h, WM_COPYDATA, ..);
Джо (2005-12-07 21:14:00) [22]
> [50] gdaujk © (07.12.05 21:13)
> Только с семафорами всё равно намного лучше.
Попробую поверить на слово :)
gdaujk (2005-12-07 21:13:00) [23]Джо © (07.12.05 21:04) [49]
Только с семафорами всё равно намного лучше.
Джо (2005-12-07 21:04:00) [24]
> [48] gdaujk © (07.12.05 21:01)
Так вроде и CreateMutex независим от версии Windows?
gdaujk (2005-12-07 21:01:00) [25]А с семафорами точно намного лучше, вроде полная независимость от версии Windows!!! Хотя пробовал только на XP.
Выкладывать не стану, кто хочет - сам напишет. А написать очень советую...
PS: Leonid Troyanovsky, спасибо, что просвятили дурака...
gdaujk (2005-12-07 20:10:00) [26]Джо © (07.12.05 19:38) [45]
SEMAPHORE_MODIFY_STATE уже сам догадался :-) Но спасибо.
Alexander Panov © (07.12.05 19:44) [46]
Спасибо.
Alexander Panov (2005-12-07 19:44:00) [27]
SEMAPHORE_ALL_ACCESS = $01f0003
SEMAPHORE_MODIFY_STATE = 2
SYNCHRONIZE = $0100000
Джо (2005-12-07 19:38:00) [28]
SEMAPHORE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3);
SEMAPHORE_MODIFY_STATE = $0002;
Из windows.pas для D2005. Могу выслать или уточни "и т.п.".
gdaujk (2005-12-07 19:36:00) [29]Leonid Troyanovsky © (07.12.05 18:48) [36]
Это конечно полный offtop, но возникла проблемма: где взять констатны SEMAPHORE_ALL_ACCESS, SEMAPHORE_MODIFY_STATE, и т. п. для OpenSemaphore? У меня в Windows.pas их нет.
PS: Можно хотябы их значения...
Leonid Troyanovsky (2005-12-07 19:24:00) [30]
> Alexander Panov © (07.12.05 19:10) [42]
> Захватывается он системой, и в MSDN описано, для чего.
Это немного не то.
Зато я нашел подтверждение своей мысли,
в описалове к AllowSetForegroundWindow:
Windows 95/98/Me: This function is not implemented. Therefore, processes must cooperate to manage the foreground window. For example, an application may wish to support only one instance. When the second instance starts up, it should detect the previous instance and call SetForegroundWindow on the window of the previous instance. It should not post a message to the window of the previous instance asking it to call SetForegroundWindow on itself, because the previous instance will not necessarily have permission to call SetForegroundWindow.
--
Regards, LVT.
Alexander Panov (2005-12-07 19:10:00) [31]Leonid Troyanovsky © (07.12.05 19:07) [41]
Если уж его залочили, то, видимо, не без для этого оснований.
Захватывается он системой, и в MSDN описано, для чего.
У нас больше оснований снять блокировку.
Leonid Troyanovsky (2005-12-07 19:07:00) [32]
> Alexander Panov © (07.12.05 19:00) [39]
> С учетом [38] вообще-то не все;)
Если уж его залочили, то, видимо, не без для этого оснований.
Т.е., в этом случае он и рассчитывал на лишь поморгать.
--
Regards, LVT.
gdaujk (2005-12-07 19:01:00) [33]Leonid Troyanovsky © (07.12.05 18:48) [36]
Приемущества семафора понял, объяснять не надо.
PS: автор врядли сам справится что с семафорами, что с мутексами, что с маппингами, так что [29] для него сасое то. А я щас семафоры-то наверное попробую...
Alexander Panov (2005-12-07 19:00:00) [34]Leonid Troyanovsky © (07.12.05 18:44) [35]
И все, собс-но.
С учетом [38] вообще-то не все;)
Alexander Panov (2005-12-07 18:57:00) [35]Игорь Шевченко © (07.12.05 18:27) [32]
почему, собстна нельзя просто вызвать SetForegroundWindow ?
Foreground and Background Windows
Each process can have multiple threads of execution, and each thread can create windows. The thread that created the window with which the user is currently working is called the foreground thread, and the window is called the foreground window. All other threads are background threads, and the windows created by background threads are called background windows.
Each thread has a priority level that determines the amount of CPU time the thread receives. Although an application can set the priority level of its threads, normally the foreground thread has a slightly higher priority level than the background threads. Because it has a higher priority, the foreground thread receives more CPU time than the background threads. The foreground thread has a normal base priority of 9; a background thread has a normal base priority of 7.
The user sets the foreground window by clicking a window, or by using the ALT+TAB or ALT+ESC key combination. To retrieve a handle to the foreground window, use the GetForegroundWindow function. To check if your application window is the foreground window, compare the handle returned by GetForegroundWindow to that of your application window.
An application sets the foreground window by using the SetForegroundWindow function.
Windows NT 4.0 and earlier, Windows 95: If the new foreground window is a top-level window, the system activates it; otherwise, it activates the associated top-level window.
Windows 98/Me/2000/XP: The system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:
The process is the foreground process.
The process was started by the foreground process.
The process received the last input event.
There is no foreground process.
The foreground process is being debugged.
The foreground is not locked (see LockSetForegroundWindow).
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).
Windows 2000/XP: No menus are active.
Windows 2000/XP: A process that can set the foreground window can enable another process to set the foreground window by calling the AllowSetForegroundWindow function, or by calling the BroadcastSystemMessage function with the BSF_ALLOWSFW flag. The foreground process can disable calls to SetForegroundWindow by calling the LockSetForegroundWindow function.
gdaujk (2005-12-07 18:52:00) [36]Leonid Troyanovsky © (07.12.05 18:44) [35]
А говорили: "... ни с кем не поделюсь" :-) Интересный вариант, надо попробовать.
Но в общем-то, на сколько я понял, вам не нравится метод мой, а не его реализация?
PS: А можно ишшо про приемущества семафоров?
Leonid Troyanovsky (2005-12-07 18:48:00) [37]
> Eraser © (07.12.05 18:33) [34]
> Ну да, по логике, после закрытия текущего окна,
Это можно сделать до создания окна.
А запущенное юзером, скажем, из экплорера или из комстроки
вторая копия будет foreground (по определению).
--
Regards, LVT.
Leonid Troyanovsky (2005-12-07 18:44:00) [38]
> gdaujk © (07.12.05 18:30) [33]
> PS: а что ишшо не нравится? Я поправлю...
+ Mutex, +ForceForeground и др.
Т.е., берешь именованный FileMapping, и хранишь там нужный хендл окна.
Если маппинг с таким именем уже есть, то читается этот хендл и делается:
h := GetWindowLong(ahwnd, GWL_HWNDPARENT); // окно приложения
if IsIconic(h) then
ShowWindow(h, SW_RESTORE);
SetForegroundWindow(h);
SendMessage(h, WM_COPYDATA, ..);
Halt;
И все, собс-но.
--
Regards, LVT.
Eraser (2005-12-07 18:33:00) [39]
> Игорь Шевченко ©
Ну да, по логике, после закрытия текущего окна, активным станет то, для которого вызвана SetForegroundWindow.
gdaujk (2005-12-07 18:30:00) [40]Leonid Troyanovsky © (07.12.05 18:12) [31]
Особенно мне не нравятся всякие бродкасты.
Чем? В Win2k оные никаких проблем не создают...
PS: а что ишшо не нравится? Я поправлю...