IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Написать прогу, которая будет нажимать кнопки в чужом окне (http://www.imho.ws/showthread.php?t=71086)

SolidSnake 15.10.2004 11:37

Написать прогу, которая будет нажимать кнопки в чужом окне
 
Помогите, серьёзная проблема. Мне надо прогу напсать, она должна нажимать на чужие Батоны (кнопки в чужом окне). Это можно сделать программно через посылку сообщения по Хендлу контрола. Я могу конечно вычислить хендля объекта под крысой, но это неудобно(каждый раз тыкать прогу носом в чужой контрол). Скажите, нельзя ли по хендлу окна вычислить хендлы его дочерних контролов. Причём, скажу сразу, в Винде их хендлы неизвестны, они не регистрируются и поиск через FindWindow бесполезен.
Зарание благодарен.

Rander 15.10.2004 12:23

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

alexey_ma 15.10.2004 15:08

Цитата:

SolidSnake:
Скажите, нельзя ли по хендлу окна вычислить хендлы его дочерних контролов. Причём, скажу сразу, в Винде их хендлы неизвестны, они не регистрируются и поиск через FindWindow бесполезен.
Запросто.
В "Винде" всё известно.
FindWindow ищет только окна верхнего уровня.
Из MSDN:
Код:

The FindWindow function retrieves a handle to the top-level window ....
Но есть функция FindWindowEx
Из MSDN:
Код:

HWND FindWindowEx( HWND hwndParent,
    HWND hwndChildAfter,
    LPCTSTR lpszClass,
    LPCTSTR lpszWindow
);

И еще можно просто сделать рекурсивный обход по окнам с помощью фукции GetWindow и проверять окна на нужный тебе класс и заголовок(GetWindowText и GetClassName).

SolidSnake 15.10.2004 15:25

Не-е-е-е!
 
Нет, ты не так понял. моя программа - не просто нажималка.
Вообще у нас в ВГУ на ФКН часто используется локальный чат NSCat (написан нашими же). Но в неём куча недостатков и мало функций. Я решил было его модернизировать, но исходников не получил. Менч посетила идея: мне нужно всего лишь научиться вставлять в поле редактора текст сообщения и нажимать на "Отправить" программным способом. Это вкратце, на самом деле я задумал большее... И всё упирается в поиск дочерних объектов.
Помогите. :молись:

alexey_ma

Спасибо большое за подсказку. Я только не пойму, что за параметр Child: HWND. Если не трудно, просвети, а? :confused:

Ghost 15.10.2004 15:56

SolidSnake
А если сделать по-другому: прослушать сеть и определить, по какому порту идет связь между клиентами, а так же каков формат посылаемого сообщения (содержит ли оно какие-либо управляющие символы или просто голый текст); написать прогу, которая будет создавать сокет-клиент на этом порту и отправлять твои сообщения...

И еще, насчет поиска окон: c помощью
Код:

HWND FindWindow(

    LPCTSTR lpClassName,        // pointer to class name
    LPCTSTR lpWindowName        // pointer to window name
  );

ищешь окно нужной проги. Потом применяешь
Код:

BOOL EnumChildWindows(

    HWND hWndParent,        // handle to parent window
    WNDENUMPROC lpEnumFunc,        // pointer to callback function
    LPARAM lParam        // application-defined value
  );

Здесь hWndParent - хэндл родительского окна, lpEnumFunc - адрес функции, которая будет вызываться для каждого найденного окна, а lParam - параметр, который будет передаваться в эту функцию.

alexey_ma 15.10.2004 16:58

Цитата:

SolidSnake:
Я только не пойму, что за параметр Child: HWND. Если не трудно, просвети, а?
Ты про какую функцию спрашиваешь?
Если про GetWindow то вот пример поиска дочернего окна по заголовку:
Код:

HWND CXXXXX::FindBtnPreview()
{
        HWND hTempChild = NULL;
            //m_hDlgWithPreview-Это родительское окно
        hTempChild = ::GetWindow(m_hDlgWithPreview, GW_CHILD);
        TCHAR Caption[100];
        while (hTempChild)
        {
                ::GetWindowText(hTempChild,Caption,99);
                if (_tcsstr(Caption,_T("Preview")))
                        break;
                else
                        hTempChild = ::GetWindow(hTempChild,GW_HWNDNEXT);
        }
        return hTempChild;
}

Хотя Ghost безусловно прав, более правильно использовать EnumChildWindows вместо
GetWindow потому что :
MSDN
Код:

This function is more reliable than calling the GetWindow function in a loop.
An application that calls GetWindow to perform this task risks being caught in
an infinite loop or referencing a handle to a window that has been destroyed.


SolidSnake 15.10.2004 18:02

Давайте сделаем попроще.

Дано:
в какой-то проге контрол.
Его classname='button',
windowname='caption'.
Найти: хэндл этого контрола.

Примечание 'button' и 'caption' - реальные класс и имя контрола. Они зарание известны.

Укого есть какие предложения, дайте, пожалуйста, код.

Ещё раз всем спасибо.

alexey_ma 15.10.2004 20:43

Если у тебя есть хендел главного окна в котором нужно искать ребенка то можешь сделать примерно так :
Код:

HWND MyFindWindow(HWND hParent, const CString& strCaption,const CString& strClassName)
{
        TCHAR sClass[255];
        TCHAR sCaption[255];
        HWND hWnd = hParent;
        HWND hFirstChild =  NULL;
        HWND hNextWnd =  NULL;
        HWND hTmpWnd =NULL;
        if(hWnd)
        {
                ::GetClassName(hWnd,sClass,254);
                ::GetWindowText(hWnd,sCaption,254);
                if(_tcscmp(sClass,strClassName) ==0 && _tcscmp(sCaption,strCaption)==0)
                        return hWnd;
                hFirstChild =::GetWindow(hWnd,GW_CHILD);
                hTmpWnd = MyFindWindow(hFirstChild,strCaption,strClassName);
                if(hTmpWnd)
                        return hTmpWnd;
                hNextWnd =::GetWindow(hWnd,GW_HWNDNEXT);
                hTmpWnd = MyFindWindow(hNextWnd,strCaption,strClassName);
                if(hTmpWnd)
                        return hTmpWnd;
        }
        return NULL;
}

Только начинать нужно не с самого главного окна а с его первого ребенка.
То есть сделай сначала так:
HWND hFirstChild = ::GetWindow(hParent,GW_CHILD);
А потом вызов функции
HWND hFoundWindow=MyFindWindow(hFirstChild ,strCaption,strClassName);

Надеюсь :yees: что вся эта пурга будет работать.


Часовой пояс GMT +4, время: 09:14.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.