|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Показать окно, за место запуска копии
Здравствуйте.
Решил написать программу, для прослушивания музыки с "ВКонтакте". Почитал и понял, что там всё сложновато для меня) Делать всё через API VK... Делал для того, что бы музыка играла на фоне, когда играю в игры. Пользуюсь браузером Firefox, если включить его, он жрет оперативу "~250.000"кб.. В общем многовато для меня. Я сделал так, кинул на форму twebbrowser, сделал маленькое окошко, при включении открывается мобильная версия Вконтакте(не вк, потому что в мобильной версии там всё компактно, красиво ) Добавил функцию трея.. В общем жрет она по сравнению в firefix`ом очень мало, "40.000"кб. Решил еще добавить такую штуку, что бы нельзя было запустить вторую копию программы. Когда запускаю копию, появляется окошко, мол типа запущена уже программа... Хотелось бы еще добавить активацию этой программы. То-есть программа например запущена, я запускаю еще раз ее, появляется окошко"программа уже запущена", жму ок и после этого окно программы вылазиет из трея по вер всех окон. Подскажите как можно сделать. Если вдруг надо, вот как делал запрет на вторую копию: Код:
program Project1; uses Forms, Windows, Unit1 in 'Unit1.pas' {Form1}; {$R *.res} begin CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, 1024, 'Programm Name'); if GetLastError <> ERROR_ALREADY_EXISTS then begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end else begin Application.MessageBox('Программа уже запущена'+#13#10+'запуск второй копии невозможен', 'Внимание'); halt; end; end. |
#2
|
||||
|
||||
Цитата:
|
#3
|
||||
|
||||
Штатный способ для подобных задач -- функция RegisterWindowMessage.
|
#4
|
|||
|
|||
Цитата:
Это для передачи сообщения первой копии. Вот мой код: Файл проекта. Код:
... function AllowSetForegroundWindow(dwProcessId: DWORD): BOOL; stdcall; external 'user32.dll'; function IsSecondInstance : Boolean; var hMutex : THandle; begin Result := False; WndMessage := RegisterWindowMessage(PChar(GetMessageName)); hMutex := CreateMutex(Nil, True, PChar(GetMutexName)); If hMutex<>0 Then If GetLastError=ERROR_ALREADY_EXISTS Then Begin AllowSetForegroundWindow(DWORD(-1)); PostMessage(HWND_BROADCAST,WndMessage,0,0); Result := True; End; end; begin If IsSecondInstance Then Halt(0); Application.Initialize; Application.Title := 'Window Switcher'; Application.CreateForm(TMainForm, MainForm); Application.HookMainWindow(MainForm.HookMessageProc); Application.Run; end. MainForm.HookMessageProc: Код:
... var MainForm: TMainForm; WndMessage : Cardinal; implementation function TMainForm.HookMessageProc(var Message: TMessage): Boolean; begin Result := False; If Message.Msg = WndMessage Then Begin ActivateMainForm; Result := True; End; end; |