Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Отключить таймер в другой проге


Автор: Vetos 6.2.2007, 12:00
Моя программа не запускается  повторно, т.е. если есть копия.
При проверке копии она передаёт ей фокус и отрубается, надо чтоб отключался и таймер только в копии. Знаю что нифига не понятно,но просмотрев код всё становится ясно.
Вот код:
Код

program Jurnal;

uses
  Forms,
  windows,
  dialogs,
  Main in 'Main.pas' {Form1};
{$R *.res}
var H:HWND;

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

begin
  if check then
  begin
   h:=findwindow(nil, 'Журнал   ');
   showwindow(h,SW_NORMAL);
   SetForegroundWindow(h);
   {Сдесь нужно отрубить таймер копии}
   exit;
  end;
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
 

Пожалуйсто помогите. Если что не понятно задайте вопрос, я отвечу, просто я не знаю как сформулировать это правильно.
Заранее спасибо. smile 

Автор: _hunter 6.2.2007, 12:05
самый простой способ заведи ыторой мьютекс и проверяй его при старте. если мюютекс занят -- мы к копии (можно включать таймер)

Автор: Vetos 6.2.2007, 12:14
Дело в том что таймер в копии включен, а его нужно выключить из только запущенной копии, и отроубить запущенную копию.
Твой вариант я не совсем понял.

Автор: Romikgy 6.2.2007, 12:17
а где сам таймер?

Автор: Vetos 6.2.2007, 12:25
Сам таймер находиться в модуле.
В принципе мне нужно найти в чужой программе компонет TTimer и отрубить его.
Просто я не знаю команд для этой операции.

Автор: Romikgy 6.2.2007, 12:43
в другой проге( она твоя ксати?)
только один таймер или их там много?

Автор: Vetos 6.2.2007, 12:53
Прога моя, таймер один, если запускаем её ещё раз то показываем уже запущенную, отрубаем в ней таймер, выходим.
Всё реализовано кроме отключения таймера.

Автор: _hunter 6.2.2007, 13:05
Цитата(Vetos @  6.2.2007,  12:14 Найти цитируемый пост)
Дело в том что таймер в копии включен, а его нужно выключить из только запущенной копии, и отроубить запущенную копию.

в смысле? копия твоя? в ней (в таймере) и проверяй наличие второго (предварительно запущенного) экземпляра. или под копией ты понимаеш первым запущенное приложение?

тамер убивается функцией KillTimer или Enabled в false поставиь...

Автор: Romikgy 6.2.2007, 13:28
я бы сделал через глобальное сообщение, если пришло таймер гасим
а так .... найти трудно сам таймер имхо в чужом коде

Автор: Vetos 6.2.2007, 13:46
Цитата

в смысле? копия твоя? в ней (в таймере) и проверяй наличие второго (предварительно запущенного) экземпляра. или под копией ты понимаеш первым запущенное приложение?

тамер убивается функцией KillTimer или Enabled в false поставиь... 

Прога одна - моя. Это журнал.
после регистрации в журнале прога скрывается, включается таймер, по истечению которого прога показывается.
При запуске проги повторно, показываем ранее запущенную, отрубаем в ней таймер и выходим.
Т.е. при повторном запуске должна появиться уже запущенная, как будто-бы запустилась только-что.
Я не знаю команд типа FindWindowEx чтобы убить таймер.
 Таймер нужно убить в уже запущенной проге.

Автор: Romikgy 6.2.2007, 14:19
ничего умнее мне в голову не приходит ,
написать хук на WM_TIMER и не давать ему хода

Автор: _hunter 6.2.2007, 14:50
Цитата(Vetos @  6.2.2007,  13:46 Найти цитируемый пост)
после регистрации в журнале прога скрывается, включается таймер, по истечению которого прога показывается.При запуске проги повторно, показываем ранее запущенную, отрубаем в ней таймер и выходим.

значит делай так:
запускаемый екземпляр проверяет мьютекс (тот, что у тебя есть) и если он занят -- устанавливает событие (CreateEvent...) .
в таймере проверяй наличие этого события. если оно есть -- выполняй KillTimer для себя же.
все...

Автор: RA 6.2.2007, 23:50
Для этого есть функция KillTimer


Эта функция по заголовку программы убьёт все таймеры, но только в приложении на Delphi
Код



procedure KillTIMERS(Caption: STRING);
Var
i:integer;
  Hinst : THandle;
  WndArr : array of THandle;
  Wnd : THandle;
begin
 Wnd:=FindWindow(nil,pchar(Caption));
 if Wnd=0 then Exit;
 hinst:=GetWindowLong(Wnd, GWL_HINSTANCE);
 EnumWindows(@GetTimerWindows,0);
 for i:=0 to High(WndArr) do
       KillTimer(WndArr[i],1);
end;


Автор: Romikgy 6.2.2007, 23:58
Цитата(RA @  6.2.2007,  22:50 Найти цитируемый пост)
GetTimerWindows

на это интересно посмотреть 
подразумеваю по хистенсу сортировка

Цитата(RA @  6.2.2007,  22:50 Найти цитируемый пост)
 Wnd:=FindWindow(nil,pchar(Caption));

имхо достаточно и application.handle

Автор: RA 7.2.2007, 14:34
Romikgy, Дык речь идёт о чужом приложении как я понял

Добавлено @ 14:36 
Код

function GetTimerWindows(Handle: HWND; Info: Pointer): BOOL; stdcall;
const
 sClName ='TPUtilWindow';
var
 s : String;
begin
 Result := True;
 SetLength(s,Length(sClName)+1);
 GetClassName(Handle, PChar(s),Length(s));
 SetLength(s,Length(sClName)); // Любит запихивать сивол #0 :)
 if (GetWindowLong(Handle, GWL_HINSTANCE) = Hinst) and
    (s=sClName)
 then
   begin
     SetLength(WndArr,High(WndArr)+2);
     WndArr[High(WndArr)]:=Handle;
   end;
end;

Автор: Romikgy 7.2.2007, 14:45
Цитата(RA @  7.2.2007,  13:34 Найти цитируемый пост)
Дык речь идёт о чужом приложении как я понял

да smile проехал я smile

Автор: Gudzon 8.2.2007, 07:59
Я предлогаю действовать чере handle, добраться через хендл окна до таймера и отрубить его.

Цитата

Пример: как, имея HANDLE окна, добавить запись в EditBox, находящемуся в этом окне?


function ChangeWndFirstEditText(Wnd: HWND; const Text: string):
  boolean;
var
  EditWnd: HWND;
begin
  Result := False;
  EditWnd := FindWindowEx(Wnd, 0,
    'EDIT', nil);
  if EditWnd = 0 then
    exit; // edit not found
  Result := SendMessage(EditWnd, WM_SETTEXT, 0, Integer(PChar(Text))) <> 0;
end;


Автор: Rennigth 8.2.2007, 10:45
Gudzon,  Ты не перестаешь меня удивлять...  smile 
Объясни, что ты вот этим:

Цитата(Gudzon @  8.2.2007,  07:59 Найти цитируемый пост)


Цитата

Пример: как, имея HANDLE окна, добавить запись в EditBox, находящемуся в этом окне?


function ChangeWndFirstEditText(Wnd: HWND; const Text: string):
  boolean;
var
  EditWnd: HWND;
begin
  Result := False;
  EditWnd := FindWindowEx(Wnd, 0,
    'EDIT', nil);
  if EditWnd = 0 then
    exit; // edit not found
  Result := SendMessage(EditWnd, WM_SETTEXT, 0, Integer(PChar(Text))) <> 0;
end;


хотел показать?  smile 


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)