Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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


Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы
Старый 14.07.2007, 12:54   #11
MaGiCaN
 
Регистрация: 13.07.2007
Сообщений: 6
По умолчанию

Цитата:
Сообщение от unnamed Посмотреть сообщение
Если известны только относительные координаты (x0,y0) кнопки, то можно нажать на неё мышкой

Код:
HWND wnd;
wnd=FindWindowEx(0,0,"Имя окна",0); // получаем хэндл окна с кнопкой
if (!wnd) 
{
  MessageBox(0,"окно не найдено",0,MB_OK);
  exit(1); 
} 
RECT r; 
GetWindowRect(wnd,&r);   // получаем координаты окна.
POINT prev_pos;
GetCursorPos(&prev_pos);           // запоминаем положение курсора 
SetCursorPos(x0+r.left,y0+r.top); // устанавливаем курсор над кнопкой
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0); // надавливаем 
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);      // отпускаем
SetCursorPos(prev_pos.x,prev_pos.y); // возвращаем курсор на прежнее место
А если имя окна извесно наполовину?
например заголовок окна:
приложение имя_приложения.exe

Тоесть заголовок наполовину всегда разный тогда как поступить?
MaGiCaN вне форума
Старый 14.07.2007, 21:22   #12
unnamed
Пользователь
 
Регистрация: 08.04.2007
Сообщений: 15
По умолчанию

Цитата:
Сообщение от MaGiCaN Посмотреть сообщение
А если имя окна извесно наполовину? ...
Если нужное окно можно идентифицировать только по имени, которое ко всему ещё и не известно, а известна только его структура, то нужно просмотреть имена всех запущенных окон и выбрать подходящее.

Код:
HWND wnd;
wnd=GetWindow(GetDesktopWindow(),GW_CHILD); // получаем первое работающее окно
char wnd_name[1025];
while (wnd) // перебираем все работающие окна
{  
  GetWindowText(wnd,wnd_name,1024);  // получаем имя текущего окна
  if (Necessary(wnd_name)) break; // если имя подходит, то прекращаем поиск
    else wnd=GetWindow(wnd,GW_HWND_NEXT); иначе - повторяем цикл для следующего окна
}
if (wnd) // если окно было найдено
{
  код из моего предыдущего сообщения
}

Здесь Necessary - функция, которой передаётся строка, а он возвращет либо true, либо false, в зависимости от того, удовлетворяет ли строка каким-то критериям, т.е. вам, MaGiCaN, нужно написать функцию, котора по имени окна даёт ответ, искомое ли это окно или нет.
Практика - лучший критерий истины. К.Маркс.
unnamed вне форума
Старый 19.07.2007, 17:57   #13
MaGiCaN
 
Регистрация: 13.07.2007
Сообщений: 6
По умолчанию

Код:
HWND wnd;
wnd=GetWindow(GetDesktopWindow(),GW_CHILD); // получаем первое работающее окно
char wnd_name[1025];
while (wnd) // перебираем все работающие окна
{  
  GetWindowText(wnd,wnd_name,1024);  // получаем имя текущего окна
  if (Necessary(wnd_name)) break; // если имя подходит, то прекращаем поиск
    else wnd=GetWindow(wnd,GW_HWND_NEXT); иначе - повторяем цикл для следующего окна
}
if (wnd) // если окно было найдено
{
  код из моего предыдущего сообщения
}
Написано с ошибками пэтому неработат, подскажите что делать.

Необходимо просто найти окно по части его названия.
MaGiCaN вне форума
Старый 20.07.2007, 14:59   #14
unnamed
Пользователь
 
Регистрация: 08.04.2007
Сообщений: 15
По умолчанию

И вправду есть ошибка - не GW_HWND_NEXT, а GW_HWNDNEXT.
Конечный вариант:

Код:
bool Necessary(char *s)
{
  return strstr(s,"алькулято")>=s;
}

//ОСНОВНАЯ ЧАСТЬ ПРОГРАММЫ:

  HWND wnd;
  wnd=GetWindow(GetDesktopWindow(),GW_CHILD);
  char wnd_name[1025];
  while (wnd)
  {
    GetWindowText(wnd,wnd_name,1024);
    if (Necessary(wnd_name)) break;
      else wnd=GetWindow(wnd,GW_HWNDNEXT);
  }
  if (wnd)
  {
    RECT r;
    GetWindowRect(wnd,&r);
    POINT prev_pos;
    GetCursorPos(&prev_pos);
    SetCursorPos(240+r.left,149+r.top);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    SetCursorPos(prev_pos.x,prev_pos.y);
  } else MessageBox(0,"WINDOW NOT FOUND",0,0);
Если на момент работы этого кода в системе будет запущен Калькулятор, и его окно не будет скрыто под другими, то на нём будет нажата кнопка "7".
Вам, MaGiCaN, остаётся только изменить координаты (240,149) и слово "алькулято", на то, что вам нужно.
Практика - лучший критерий истины. К.Маркс.
unnamed вне форума
Старый 20.07.2007, 17:55   #15
MaGiCaN
 
Регистрация: 13.07.2007
Сообщений: 6
По умолчанию

Цитата:
Сообщение от unnamed Посмотреть сообщение
И вправду есть ошибка - не GW_HWND_NEXT, а GW_HWNDNEXT.
Конечный вариант:

Код:
bool Necessary(char *s)
{
  return strstr(s,"алькулято")>=s;
}

//ОСНОВНАЯ ЧАСТЬ ПРОГРАММЫ:

  HWND wnd;
  wnd=GetWindow(GetDesktopWindow(),GW_CHILD);
  char wnd_name[1025];
  while (wnd)
  {
    GetWindowText(wnd,wnd_name,1024);
    if (Necessary(wnd_name)) break;
      else wnd=GetWindow(wnd,GW_HWNDNEXT);
  }
  if (wnd)
  {
    RECT r;
    GetWindowRect(wnd,&r);
    POINT prev_pos;
    GetCursorPos(&prev_pos);
    SetCursorPos(240+r.left,149+r.top);
    mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
    mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
    SetCursorPos(prev_pos.x,prev_pos.y);
  } else MessageBox(0,"WINDOW NOT FOUND",0,0);
Если на момент работы этого кода в системе будет запущен Калькулятор, и его окно не будет скрыто под другими, то на нём будет нажата кнопка "7".
Вам, MaGiCaN, остаётся только изменить координаты (240,149) и слово "алькулято", на то, что вам нужно.
Это вообще на дельфи код?))
ругается почти на все строки.
MaGiCaN вне форума
Старый 20.07.2007, 18:32   #16
unnamed
Пользователь
 
Регистрация: 08.04.2007
Сообщений: 15
По умолчанию

Цитата:
Сообщение от MaGiCaN Посмотреть сообщение
Это вообще на дельфи код?))
ругается почти на все строки.
чёрт! я так и знал!
Практика - лучший критерий истины. К.Маркс.
unnamed вне форума
Старый 21.07.2007, 12:32   #17
MaGiCaN
 
Регистрация: 13.07.2007
Сообщений: 6
По умолчанию

Цитата:
Сообщение от unnamed Посмотреть сообщение
чёрт! я так и знал!
непонял, что ты так и знал?
MaGiCaN вне форума
Старый 25.03.2008, 18:42   #18
Kukkk
Форумчанин
 
Регистрация: 28.06.2007
Сообщений: 123
По умолчанию

Подскажите пожалуйста! А как узнать доступность кнопки в другом приложении? Например если она неактивна, мое приложение на нее нажимает и это вызывает ошибку,подскажите пожалуйста как этого избежать?
Kukkk вне форума
Старый 25.03.2008, 20:46   #19
rpy3uH
добрый няша
СуперМодератор
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,808
По умолчанию

функция IsWindowEnabled
rpy3uH вне форума
Старый 06.10.2008, 15:09   #20
s_chechel
Новичок
Джуниор
 
Регистрация: 03.10.2008
Сообщений: 2
По умолчанию

Есть проблемка.
Програмно нахожу окно, нахожу кнопку. Нажимаю на кнопку. Открывается второе окно. И на этом все. Моя программа стоит как вкопанная пока не закрою или не нажму на открывшемся окне какую то кнопку.

Пробовал:
SendMessage(TheChildHandle,BM_CLICK , 0, 0);
и
SendMessage(TheChildHandle,WM_LButt onDown, 1, 1);
SendMessage(TheChildHandle, WM_LButtonUP, 1, 1);

В первом случае команда нажатия одна, на ней и клинит, во втором стоим на WM_LButtonUP.
s_chechel вне форума
Закрытая тема

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу нажать на кнопку 'Отправить' с помощью IdHTTP Dron_kss Работа с сетью в Delphi 3 17.04.2009 13:34
Нажать кнопку Dron_kss Работа с сетью в Delphi 1 28.03.2009 18:33
Программно нажать кнопку DeDoK Общие вопросы Delphi 2 04.05.2008 21:46
Нажать кнопку Teen4jump Работа с сетью в Delphi 11 29.02.2008 09:33
Как программно нажать Ctrl + V ffo Win Api 11 29.07.2007 17:58