Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как наити нужную программу???  (Прочитано 14268 раз)
0 Пользователей и 6 Гостей смотрят эту тему.
Johnson™
Гость
« : 11-11-2003 05:09 » 

Помогите начинающему... Нужно чтобы моя программа работала только если запушена и в данный момент активна другая программ. Пытаюсь...
 
Код:
  AppWnd:= GetForegroundWindow();
   id:=FindWindow('OWL_Window','Имя программы');
   if id=AppWnd then
     begin
....
     end;
Почему то не выходит... хотя программа запущена и активна.
« Последнее редактирование: 21-11-2007 15:43 от Алексей1153++ » Записан
Xeysan
Гость
« Ответ #1 : 11-11-2003 05:57 » 

А как ты запускаешь программу? Может в момент запуска искомое окно уже не активное?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #2 : 11-11-2003 06:24 » 

FindWindow ищет по Caption (WM_GETTEXT), а не по имени программы.
Смотри GetProcessImageFileName...
Записан

while (8==8)
Anonymous
Гость
« Ответ #3 : 11-11-2003 07:13 » 

FindWindow ищет по заголовку программы когда...
Код:
hwnd:= FindWindow(nil,'Заголовок программы');
if hwnd<>0 then Оно ...
всё работает, а когда сравниваю с активным окном не работает
« Последнее редактирование: 21-11-2007 15:43 от Алексей1153++ » Записан
Anonymous
Гость
« Ответ #4 : 11-11-2003 08:30 » new

Надо чтобы программа обрабатывалась при запущеном другом приложении при условии что приложение за которам наблюдаю активно т.е. в нем работают а не минимизировано. Даже если оно не активно тоничего происходить и не должно, но даже когда я её активной делаю ничего не меняется. Создается такое впечатление что GetForegroundWindow возвращает не тот дескриптор. Как ещё можно узнать дескриптор окна в котором в данный момент работает пользователь???
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


« Ответ #5 : 11-11-2003 09:59 » 

Если это родительская программа - передавай своей ее имя в параметре.
Записан

А птичку нашу прошу не обижать!!!
blackman
Гость
« Ответ #6 : 11-11-2003 12:32 » 

Не допустить запуск второй копии программы

procedure TForm1.FormCreate(Sender: TObject);

var ExtendedStyle:dword;
Wnd : hWnd; buff : ARRAY[0.. 127] OF Char;

begin
Wnd := GetWindow(Handle, gw_HWndFirst); WHILE Wnd <> 0 DO BEGIN  IF (Wnd <> Application.Handle)
AND (GetWindow(Wnd, gw_Owner) = 0)  THEN BEGIN   GetWindowText (Wnd, buff, sizeof (buff ));
 IF StrPas (buff) = Application.Title THEN
  BEGIN        Halt;   END;
END;  Wnd := GetWindow (Wnd, gw_hWndNext); END;

END;
Записан
nebula
Гость
« Ответ #7 : 11-11-2003 12:41 » 

procedure TForm1.Timer1Timer(Sender: TObject);
var
  fw: HWND;
  cn: PChar;
  c: PChar;
begin
  fw := GetForegroundWindow;
  GetMem(c, GetWindowTextLength(fw) + 1);
  GetMem(cn, 255);
  GetWindowText(fw, c, GetWindowTextLength(fw) + 1);
  GetClassName(fw, cn, 255);
  ListBox1.AddItem('class: ' + string(cn) + ', caption: ' + string(c), nil);
  FreeMem(cn);
  FreeMem(c);
end;

Скорее всего, ты не то окно ищешь в FindWindow. Запусти эти строчки и активизируй нужное приложение, по полученному имени класса и заголовку и ищи.
Записан
johnson™
Гость
« Ответ #8 : 11-11-2003 13:37 » 

если использовать FindWindow то все работает приложение определяется только моя программа не будет работать только в том случае если в системе не будет приложения за которым наблюдаю...
Записан
Ощртыщт™
Гость
« Ответ #9 : 11-11-2003 14:07 » 

Пробовал такой код...
     id:=FindWindow('OWL_Window','Заголовок');
     if (id<>0)and(IsWindowVisible(id)=true) then    
не работает...(((
если использовать только
     if (id<>0)then    
всё нормально...
Записан
Anonymous
Гость
« Ответ #10 : 11-11-2003 14:28 » 

Цитата: nebula
procedure TForm1.Timer1Timer(Sender: TObject);
var
  fw: HWND;
  cn: PChar;
  c: PChar;
begin
  fw := GetForegroundWindow;
  GetMem(c, GetWindowTextLength(fw) + 1);
  GetMem(cn, 255);
  GetWindowText(fw, c, GetWindowTextLength(fw) + 1);
  GetClassName(fw, cn, 255);
  ListBox1.AddItem('class: ' + string(cn) + ', caption: ' + string(c), nil);
  FreeMem(cn);
  FreeMem(c);
end;


Попробовал находит именно то что надо и называется как надо...

Скорее всего, ты не то окно ищешь в FindWindow. Запусти эти строчки и активизируй нужное приложение, по полученному имени класса и заголовку и ищи.
Записан
Johnson™
Гость
« Ответ #11 : 11-11-2003 15:00 » 

Создаётся такое впечатление что

AppWnd:= GetForegroundWindow
id:=FindWindow('OWL_Window',Заголовок');
if (id=AppWnd)then  
id и AppWnd всегда неравны даже если одно приложение работает, а в этой последовательности случайно нет окон которые всегда считаются активными и находятся в фокусе???
Записан
cg_spooler
Гость
« Ответ #12 : 11-12-2003 12:59 » 

ID - номер процесса, кот. выдается при каждом запуске проги.
Т.е. Inc(ID) идет при каждом запуске проги. Не стоит привязываться к нему, т.к. он будет постоянно меняться, даже при повторном запуске той-же проги.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines