Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2010, 23:39   #1
lowercase
Пользователь
 
Регистрация: 15.05.2010
Сообщений: 88
По умолчанию Не создавать копию окна

всем доброго времени суток... я пишу программу и мне надо сделать так что бы в памяти была только одна копия моей программы... то есть если я запускаю еще одно такое же окно, то оно запустится не должно, а прсто должен перейти фокус на уже окрытое окно... я пробовал таким вот способом:
Код:
procedure TmainForm.FormCreate(Sender: TObject);
var wnd:HWnd;
begin
  wnd := findWindow('TmainForm','Редактор тестов');
  if wnd <> 0 then begin
    showWindow(wnd,sw_shownormal);
    application.Terminate;
  end
end;
но программа находит сама себя и вырубает...
подскажие как решить этот вопрос...
может както опредилить есть ли еще окна с таким же классом и кепшеном...

Последний раз редактировалось lowercase; 09.09.2010 в 23:43.
lowercase вне форума Ответить с цитированием
Старый 10.09.2010, 05:28   #2
ZvEr_HaCkEr
VisualC++/DirectX
Форумчанин
 
Аватар для ZvEr_HaCkEr
 
Регистрация: 16.07.2010
Сообщений: 831
По умолчанию

в OnCreate пиши:
Код:
If WaitForSingleObject(g,0)<>o
then begin 
exitprocess(0);
end;
После последнего end последней процедуры:
Код:
initialization
g:=createmutex(nil,true,pchar(extractfilename(application.exename)));
finalization
closehandle(g);
end.
g глобальная переменая типа thandle.
Только фокус возвращать не будет,а просто предотвратит повторный запуск приложения.

Последний раз редактировалось ZvEr_HaCkEr; 10.09.2010 в 05:33.
ZvEr_HaCkEr вне форума Ответить с цитированием
Старый 10.09.2010, 05:57   #3
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

еще как вариант:
Код:
program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas', Windows { Form1 } ;
{$R *.res}

var
  h: HWND;
  WinText: array [0 .. Max_Path] of WideChar;

begin

  h:= GetWindow(GetForegroundWindow, GW_HWNDFIRST);
  while h <> 0 do
  begin
    if (IsWindowVisible(h)) and
      (GetWindowText(h, WinText, sizeOf(WinText)) <> 0) then
    begin
      GetWindowText(h, WinText, sizeOf(WinText));
      if WinText = 'Form1' then  // сравнивай с заголовком своей программы
      begin
        SetForegroundWindow(h); // если программа запущена, то выводим ее на передний план
        exit;
      end;
    end;
    h:= GetWindow(h, gw_hwndNext);
  end;

  application.Initialize;
  application.MainFormOnTaskbar:= True;
  application.CreateForm(TForm1, Form1);
  application.Run;
end.
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 10.09.2010, 06:59   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,762
По умолчанию

Что то всё долго. Вот простой вариант:
Код:
program Project1;

uses
  Forms, Windows,
  Unit1 in 'Unit1.pas' {MainForm};

{$R *.res}
Var HM :THandle;

function Check: boolean;
begin
  HM:=OpenMutex(MUTEX_ALL_ACCESS, false, 'Proj');
  Result:=(HM<>0);
  if HM=0 then HM:=CreateMutex(nil, false, 'Proj');
end;

begin
    // Проверка на запуск второй копии программы
    If Check then
    exit;
  Application.Initialize;
  Application.CreateForm(TMainForm, MainForm);
  Application.Run;
end.
FaTaL вне форума Ответить с цитированием
Старый 10.09.2010, 07:33   #5
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Цитата:
Сообщение от MaxNik2009 Посмотреть сообщение
еще как вариант:
Код:
program Project1;
uses
  Forms,
  Unit1 in 'Unit1.pas', Windows { Form1 } ;
{$R *.res}

var
  h: HWND;
  WinText: array [0 .. Max_Path] of WideChar;

begin

  h:= GetWindow(GetForegroundWindow, GW_HWNDFIRST);
  while h <> 0 do
  begin
    if (IsWindowVisible(h)) and
      (GetWindowText(h, WinText, sizeOf(WinText)) <> 0) then
    begin
      GetWindowText(h, WinText, sizeOf(WinText));
      if WinText = 'Form1' then  // сравнивай с заголовком своей программы
      begin
        SetForegroundWindow(h); // если программа запущена, то выводим ее на передний план
        exit;
      end;
    end;
    h:= GetWindow(h, gw_hwndNext);
  end;

  application.Initialize;
//  application.MainFormOnTaskbar:= True;
  application.CreateForm(TForm1, Form1);
  application.Run;
end.
Код:
WinText: array [0 .. Max_Path] of WideChar;
WideChar не ест, ест просто Char
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 10.09.2010, 07:54   #6
MaxNik2009
Форумчанин
 
Аватар для MaxNik2009
 
Регистрация: 17.09.2009
Сообщений: 294
По умолчанию

Код:
WideChar не ест, ест просто Char
у меня D2010, а вообще можно и Char оставить.
принимаю благодарности в письменном виде( весы слева)...
MaxNik2009 вне форума Ответить с цитированием
Старый 10.09.2010, 12:31   #7
Nater
Пользователь
 
Регистрация: 23.05.2009
Сообщений: 59
По умолчанию

Цитата:
Сообщение от lowercase Посмотреть сообщение
всем доброго времени суток... я пишу программу и мне надо сделать так что бы в памяти была только одна копия моей программы... то есть если я запускаю еще одно такое же окно, то оно запустится не должно, а прсто должен перейти фокус на уже окрытое окно... я пробовал таким вот способом:
Код:
procedure TmainForm.FormCreate(Sender: TObject);
var wnd:HWnd;
begin
  wnd := findWindow('TmainForm','Редактор тестов');
  if wnd <> 0 then begin
    showWindow(wnd,sw_shownormal);
    application.Terminate;
  end
end;
но программа находит сама себя и вырубает...
подскажие как решить этот вопрос...
может както опредилить есть ли еще окна с таким же классом и кепшеном...
Перед проверкой меняй Caption := ''; после проверки ставь обратно.

Где то так:

Код:
procedure TmainForm.FormCreate(Sender: TObject);
var wnd:HWnd;
begin
Caption := '';
  wnd := findWindow(nil,'Редактор тестов');
  if wnd <> 0 then begin
    showWindow(wnd,sw_shownormal);
    application.Terminate;
  end
Caption :=''; // здесь делай какой был.
end;
У меня была похожая проблема, решил именно так. И не надо ничего мудрить.

P.S. а не лучше ли переменную wnd убрать?

Последний раз редактировалось Nater; 10.09.2010 в 12:34.
Nater вне форума Ответить с цитированием
Старый 10.09.2010, 14:34   #8
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Цитата:
P.S. а не лучше ли переменную wnd убрать?
поиск - довольно длительная процедура. в большинстве случаев лучше занять немного памяти, избавившись от лишних занятий процессора...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
копию сайта за 50 000 руб. fedor_sadov Фриланс 3 26.05.2010 08:25
как сделать копию оболочки программы? Mobile™ Общие вопросы Delphi 9 28.06.2009 15:29
Сохранить копию файла без макросов viter.alex Microsoft Office Excel 3 19.02.2009 13:49
Не могу создать копию проекта John_chek БД в Delphi 4 15.02.2008 15:53
Как сделать чтобы дочерние окна в MDI-приложениях были вне главного окна??? dimonchuk Общие вопросы Delphi 1 11.08.2007 12:13