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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2010, 17:34   #1
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос Найти окно ошибки и нажать OK

Как можно найти данное окно ошибки и нажать в нём OK. Известно: имя заголовка и имя кнопки на панели задач.
Изображения
Тип файла: gif Error.gif (11.1 Кб, 149 просмотров)
Shouldercannon вне форума Ответить с цитированием
Старый 14.06.2010, 18:07   #2
W0LF
Форумчанин
 
Аватар для W0LF
 
Регистрация: 28.03.2008
Сообщений: 940
По умолчанию

Такой вариант:

На таймер...
Код:
var
  Wind, Btn: HWND;
begin
  if FindWindow(nil, 'srcds.exe - Ошибка приложения') <> 0 then begin
    Wind := FindWindow(nil, 'srcds.exe - Ошибка приложения');
    Btn := FindWindowEx(Wind, 0, nil, 'OK');
    SendMessage(Btn, BM_CLICK, 0, 0);
  end;
end;
W0LF вне форума Ответить с цитированием
Старый 14.06.2010, 18:37   #3
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Спасибо, буду пробовать в работе.
Shouldercannon вне форума Ответить с цитированием
Старый 28.04.2011, 15:21   #4
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
Вопрос

Как найти на форме кнопку и нажать её. Кнопка может быть на чём угодно и следовательно нужно получать Hanld это чего угодно? Сделать автоматический поиск имея Caption формы и Caption кнопки.
Код:
  if FindWindow(nil, 'Form1') <> 0 then
  begin
    Wind := FindWindow(nil, 'Form1');
    Btn := FindWindowEx(Wind, 0, nil, 'Кнопка');
    SendMessage(Btn, BM_CLICK, 0, 0);
  end;
Shouldercannon вне форума Ответить с цитированием
Старый 28.04.2011, 22:51   #5
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Кнопки бывают разные, некоторые вообще окнами не являются.
eduard93 вне форума Ответить с цитированием
Старый 01.05.2011, 13:28   #6
Shouldercannon
Участник клуба Подтвердите свой е-майл
 
Аватар для Shouldercannon
 
Регистрация: 26.01.2008
Сообщений: 1,897
По умолчанию

Код:
function EnumChildProc(Wnd: HWND; CaptList: TStrings): BOOL; stdcall;
var
  captBuf: array[0..260] of Char;
begin
  Result := (Wnd <> 0); // условие завершения обхода дерева окон
  if Result then
  begin
    GetWindowText(Wnd, captBuf, SizeOf(captBuf)); // получаем заголовок (текст) окна
    if (Pos(CaptList[0], StrPas(captBuf)) > 0)    // проверяем не наше ли это окно
      and (CaptList.IndexOfObject(TObject(Wnd)) < 0) // проверяем не заглядывали ли мы уже в это окошко
      then CaptList.AddObject(StrPas(captBuf), TObject(Wnd)); // Добавляем в список заголовок и хэндл окна
    EnumChildWindows(Wnd, @EnumChildProc, Longint(CaptList)); // Рекурсивный обход дочерних окон
  end;
end;

function ClickButton(ParentWindow: HWND; ButtonCaption: string): Boolean;
var
  Btn: HWND;
  CaptList: TStringList; // В items-ы будем класть заголовки окон;
                         // в objects-ы будем класть хэндлы окон;
begin
  CaptList := TStringList.Create;
  try
    // В первый item листа кладем заголовок кнопки
    CaptList.AddObject(ButtonCaption, nil);

    // обходим все дочерние окна (ищем кнопку с указанным ButtonCaption )
    EnumChildWindows(ParentWindow, @EnumChildProc, Longint(CaptList));

    // Убеждаемся что нашлась ТОЛЬКО ОДНА КНОПКА с указанным ButtonCaption
    Result := ((CaptList.Count = 2) and (HWND(CaptList.Objects[1]) <> 0));

    if Result then
    begin
       Btn := HWND(CaptList.Objects[1]);
       PostMessage(Btn, BM_CLICK, 0, 0);
     { //или лучше
        SendMessage(Btn, WM_LBUTTONDOWN, 1, 1);
        SendMessage(Btn, WM_LBUTTONUP, 1, 1);
     }
    end;
  finally
    CaptList.Free;
  end;
end;
...
procedure TMyForm.btn1Click(Sender: TObject);
begin
  Wind := FindWindow(nil, 'Form1');
  if (Wind <> 0) then
  begin

    if ClickButton(Wind,'Кнопка') then
    begin
      ShowMessage('вроде нажали');
    end
    else
    begin
      ShowMessage('нету такой кнопки (или больше одной с таким капшеном)');
    end;

  end
  begin
    ShowMessage('нету окна с капшеном "Form1"');
  end;
end;
Как в таком окне нажать кнопку?
Изображения
Тип файла: gif Окно.gif (6.8 Кб, 148 просмотров)
Shouldercannon вне форума Ответить с цитированием
Старый 01.05.2011, 14:16   #7
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

А в таком окне и не надо ничего нажимать, просто завершение работы с флагом EWX_FORCE надо делать.
eduard93 вне форума Ответить с цитированием
Старый 01.05.2011, 16:56   #8
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Да в принципе у тебя направление правильное.
Только не надо вызывать рекурсию и надо учитывать знак подчеркивания в тексте.
В общем както так я бы сделал


Код:
type
  TFindInfo = reocrd
    ClsName: String;
    Text: String;
    Bounds: TRect;
    FoundBtn: HWnd;
  end;

function EnumChildProc(Wnd: HWND; var FindInfo: TFindInfo): BOOL; stdcall;
var
  captBuf: array[0..260] of Char;
begin
  Result := True; 
  with FindInfo do
  if CompareClassName() then
    if AnsiCompareText() then // здесь надо учитывать знак подчеркивания &   юзай StripHotkey()
      if CompareBounds() then begin
        FoundBtn := Wnd;
        Result := False;
     end;
          // рекурсия здесь не нужна
  
Цитата:
Remarks If a child window has created child windows of its own, EnumChildWindows enumerates those windows as well.
http://msdn.microsoft.com/en-us/library/ms633494(v=vs.85).aspx end; function ClickButton(ParentWindow: HWND; ButtonCaption: string): Boolean; var FindInfo: TFindInfo; begin // заполняем инфу FindInfo.ClsName := 'TButton'; FindInfo.... EnumChildWindows(ParentWindow, @EnumChildProc, Longint(@FindInfo)); if Btn = 0 then Exit; SendMessage(FindInfo.FoundBtn, BM_CLICK, 0, 0); или SendMessage(FindInfo.FoundBtn, WM_LBUTTONDOWN, MK_LBUTTON , MakelParam(4, 4)); SendMessage(FindInfo.FoundBtn, WM_LBUTTONUP, MK_LBUTTON , MakelParam(4, 4)); end;
xexxex вне форума Ответить с цитированием
Старый 01.05.2011, 21:38   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Мне кажется что сама идея ловить такие окна ущербна. Почему не пользовать try...exception для локализации исключений или перехватывать соответствующие сообщения windows в случае вываливания выше приведенного окна?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно программно найти окно программы и нажать на нем кнопку SeRыЙ Win Api 23 09.03.2010 08:00
найти ошибки Marseline Помощь студентам 0 22.01.2010 15:48
не могу найти как нажать мышку из программы skeletishe Общие вопросы Delphi 5 26.03.2009 20:36
Найти окно MediaPlayer DeDoK Win Api 2 11.11.2008 19:30
Найти окно по маске Иллидан Общие вопросы Delphi 2 28.02.2008 01:06