Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.06.2013, 18:40
Gareth Gareth вне форума
Активный
 
Регистрация: 21.03.2013
Адрес: Приднестровье
Сообщения: 202
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Показать окно, за место запуска копии

Здравствуйте.
Решил написать программу, для прослушивания музыки с "ВКонтакте".
Почитал и понял, что там всё сложновато для меня) Делать всё через 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  
Старый 02.06.2013, 19:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Gareth
Решил еще добавить такую штуку, что бы нельзя было запустить вторую копию программы. Когда запускаю копию, появляется окошко, мол типа запущена уже программа... Хотелось бы еще добавить активацию этой программы.
То-есть программа например запущена, я запускаю еще раз ее, появляется окошко"программа уже запущена", жму ок и после этого окно программы вылазиет из трея по вер всех окон.
Подскажите как можно сделать.

Если вдруг надо, вот как делал запрет на вторую копию:
Код:
.....
CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, 1024,
'Programm Name');
.....
Я в одном своём приложении делал такую штуку и тоже через "CreateFileMapping(HWND($FFFFFFFF)". При этом если удавалось создать такой файл - значит ещё не запущено ни одной копии моей программы - тогда я записывал в этот созданный файл хэндл "Application.Handle". А если же не удавалось создать такой файл - значит этот файл уже создала одна запущенная копия моей программы. Тогда я открывал этот файл через "OpenFileMapping", читал из него хэндл и выводил приложение с этим хэндлом на передний план, а вторая копия благополучно завершалась.
Ответить с цитированием
  #3  
Старый 03.06.2013, 00:14
Аватар для Freeman
Freeman Freeman вне форума
Местный
 
Регистрация: 05.10.2012
Адрес: Санкт-Петербург
Сообщения: 576
Версия Delphi: 6
Репутация: выкл
По умолчанию

Штатный способ для подобных задач -- функция RegisterWindowMessage.
Ответить с цитированием
  #4  
Старый 03.06.2013, 01:43
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Цитата:
Сообщение от Freeman
Штатный способ для подобных задач -- функция RegisterWindowMessage.

Это для передачи сообщения первой копии.
Вот мой код:
Файл проекта.
Код:
...
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;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:36.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter