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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.01.2009, 02:36   #1
Ash
Пользователь
 
Аватар для Ash
 
Регистрация: 27.10.2008
Сообщений: 45
По умолчанию Запущено ли приложение?

Такой вопрос: надо узнать, запущено ли в данный момент определенное приложение. То бишь чето-надо колдовать с заголовками окон, но не могу сообразить, как... В WinApi копаться не хочется, можно ли на чистом Делфи?
Ash вне форума Ответить с цитированием
Старый 26.01.2009, 02:40   #2
goblinyara
Форумчанин
 
Аватар для goblinyara
 
Регистрация: 02.01.2009
Сообщений: 340
По умолчанию

FindWindow(nil, 'Заголовок окна')
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=)
Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
goblinyara вне форума Ответить с цитированием
Старый 26.01.2009, 02:49   #3
Ash
Пользователь
 
Аватар для Ash
 
Регистрация: 27.10.2008
Сообщений: 45
По умолчанию

Это-то понятно, каюсь, некорректно поставил вопрос. Мне надо искать окно, с заголовком, содержащим только его подстроку...
Ash вне форума Ответить с цитированием
Старый 26.01.2009, 03:07   #4
goblinyara
Форумчанин
 
Аватар для goblinyara
 
Регистрация: 02.01.2009
Сообщений: 340
По умолчанию

если знаете имя класса, то та же функция, только с другими параметрами - например для Блокнота будет FindWindow('Notepad', nil)... как найти по подстроке не нашёл, но можно сделать так: у себя вы запускаете ту прогу,что отловить надо, смотрите по заголовку, узнаёте класс окна, и тогда уже его и используете....
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=)
Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
goblinyara вне форума Ответить с цитированием
Старый 26.01.2009, 03:38   #5
Ash
Пользователь
 
Аватар для Ash
 
Регистрация: 27.10.2008
Сообщений: 45
По умолчанию

Цитата:
Сообщение от goblinyara Посмотреть сообщение
у себя вы запускаете ту прогу,что отловить надо, смотрите по заголовку, узнаёте класс окна, и тогда уже его и используете....
Вот этого не понял: как я узнаю класс окна по заголовку?
Ash вне форума Ответить с цитированием
Старый 26.01.2009, 04:06   #6
goblinyara
Форумчанин
 
Аватар для goblinyara
 
Регистрация: 02.01.2009
Сообщений: 340
По умолчанию

Цитата:
Использование функции Windows API FindWindow() - простейший способ нахождение окна, при условии, что известен его заголовок или имя оконного класса. Если Вам известна только часть заголовка окна (например 'Netscape - ' + 'какой-то неизвестный URL'), Ва м нужно использовать функцию EnumWindows() для получения всех окон, затем вызывать функцию GetWindowsText() и GetClassName для поиска нужного окна. Следующий пример находит первое окно, содержащее совпадающую часть заголовка окна и полностью совпадающее название оконного класса (если он задан) и делает это окно активным.


Код:
type
  PFindWindowStruct = ^TFindWindowStruct;
  TFindWindowStruct = record
  Caption : string;
  ClassName : string;
  WindowHandle : THandle;
end;

function EnumWindowsProc(hWindow : hWnd; lParam : LongInt) : Bool {$IFDEF Win32} stdcall; {$ELSE} ; export; {$ENDIF}
var
  lpBuffer: PChar;
  WindowCaptionFound: bool;
  ClassNameFound: bool;
begin
  GetMem(lpBuffer, 255);
  Result := True;
  WindowCaptionFound := False;
  ClassNameFound := False;

  try
    if GetWindowText(hWindow, lpBuffer, 255) > 0 then
      if Pos(PFindWindowStruct(lParam).Caption, StrPas(lpBuffer)) > 0 then
        WindowCaptionFound := true;

    if PFindWindowStruct(lParam).ClassName = '' then
      ClassNameFound := True
    else
    if GetClassName(hWindow, lpBuffer, 255) > 0 then
      if Pos(PFindWindowStruct(lParam).ClassName, StrPas(lpBuffer)) > 0 then
        ClassNameFound := True;

    if (WindowCaptionFound and ClassNameFound) then
    begin
      PFindWindowStruct(lParam).WindowHandle := hWindow;
      Result := False;
    end;

  finally
    FreeMem(lpBuffer, sizeof(lpBuffer^));
  end;
end;

function FindAWindow(Caption : string; ClassName : string) : THandle;
var
  WindowInfo : TFindWindowStruct;
begin
  with WindowInfo do begin
    Caption := Caption;
    ClassName := ClassName;
    WindowHandle := 0;
    EnumWindows(@EnumWindowsProc, LongInt(@WindowInfo));
    FindAWindow := WindowHandle;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  TheWindowHandle : THandle;
begin
  TheWindowHandle := FindAWindow('Netscape - ', '');
  if TheWindowHandle = 0 then
    ShowMessage('Window Not Found!')
  else
    BringWindowToTop(TheWindowHandle);
end;
а класс можно через нижеследующую функцию узнать:
Цитата:
Функция GetClassName

Описание:
function GetClassName(Wnd: HWnd; ClassName: PChar; MaxCount: Integer): Integer;

Считывает имя класса окна.

Паpаметpы:
Wnd: Идентификатоp окна.
ClassName: Буфеp для пpиема имени класса.
MaxCount: Размеp буфеpа

Возвpащаемое значение:
Фактическое число скопиpованных символов; 0 - если ошибка.

функция находится в файле user32.dll
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=)
Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
goblinyara вне форума Ответить с цитированием
Старый 26.01.2009, 17:47   #7
Ash
Пользователь
 
Аватар для Ash
 
Регистрация: 27.10.2008
Сообщений: 45
По умолчанию

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

Код:
function IsNote: Boolean;
var h: HWND;
begin
  h := FindWindow(nil, '1 - Блокнот'); 
if h <> 0 then
    Result := True
  else
    Result := False;
end;

if IsNote then
  ShowMessage('YES')
else
  ShowMessage('NO');
end;
Прошу прощения, мой косяк, это из-за отключенного таймера...

Последний раз редактировалось Ash; 26.01.2009 в 17:50.
Ash вне форума Ответить с цитированием
Старый 27.01.2009, 08:09   #8
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

Код:
Как найти окно по неполному названию 
--------------------------------------------------------------------------------
function TForm1.Find(s: string): hWnd;
var
  Wnd: hWnd;
  buff: array[0..127] of Char;
begin
  Find := 0;
  Wnd := GetWindow(Handle, gw_HWndFirst);
  while Wnd <> 0 do
  begin
    if (Wnd <> Application.Handle) and
      IsWindowVisible(Wnd) and
      (GetWindow(Wnd, gw_Owner) = 0) and
      (GetWindowText(Wnd, buff, sizeof(buff)) <> 0) then
    begin
      GetWindowText(Wnd, buff, sizeof(buff));
      if pos(s, StrPas(buff)) > 0 then
      begin
        Find := Wnd;
        Break;
      end;
    end;
    Wnd := GetWindow(Wnd, gw_hWndNext);
  end;
end;
"Заряженному танку в дуло не смотрят" @Dekmer in WoT
Kotofff вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запустить приложение Gawwws Microsoft Office Excel 5 05.12.2008 04:53
Как проверить запущено приложение или нет? kiber0net0 Общие вопросы Delphi 2 18.09.2008 19:48
Незакрываемое приложение One.Love Общие вопросы Delphi 25 27.02.2008 18:10
Пароль на приложение Chals Общие вопросы Delphi 6 24.11.2007 21:32
MDI приложение Arsgun Общие вопросы Delphi 4 29.05.2007 12:36