| imho.ws |
![]() |
|
|
|||||||
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
|
|
# 1 |
|
Guest
Сообщения: n/a
|
Помогите, серьёзная проблема. Мне надо прогу напсать, она должна нажимать на чужие Батоны (кнопки в чужом окне). Это можно сделать программно через посылку сообщения по Хендлу контрола. Я могу конечно вычислить хендля объекта под крысой, но это неудобно(каждый раз тыкать прогу носом в чужой контрол). Скажите, нельзя ли по хендлу окна вычислить хендлы его дочерних контролов. Причём, скажу сразу, в Винде их хендлы неизвестны, они не регистрируются и поиск через FindWindow бесполезен.
Зарание благодарен. |
|
|
# 3 | |
|
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
Цитата:
В "Винде" всё известно. FindWindow ищет только окна верхнего уровня. Из MSDN: Код:
The FindWindow function retrieves a handle to the top-level window .... Из MSDN: Код:
HWND FindWindowEx( HWND hwndParent,
HWND hwndChildAfter,
LPCTSTR lpszClass,
LPCTSTR lpszWindow
);
__________________
Best Regards Последний раз редактировалось alexey_ma; 15.10.2004 в 15:11. |
|
|
|
|
|
# 4 |
|
Guest
Сообщения: n/a
|
Не-е-е-е!
Нет, ты не так понял. моя программа - не просто нажималка.
Вообще у нас в ВГУ на ФКН часто используется локальный чат NSCat (написан нашими же). Но в неём куча недостатков и мало функций. Я решил было его модернизировать, но исходников не получил. Менч посетила идея: мне нужно всего лишь научиться вставлять в поле редактора текст сообщения и нажимать на "Отправить" программным способом. Это вкратце, на самом деле я задумал большее... И всё упирается в поиск дочерних объектов. Помогите. ![]() alexey_ma Спасибо большое за подсказку. Я только не пойму, что за параметр Child: HWND. Если не трудно, просвети, а?
|
|
|
# 5 |
|
::VIP::
Звезда первого сезона Молчун-2004 Регистрация: 24.08.2002
Сообщения: 1 575
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
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
);
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы! Последний раз редактировалось Ghost; 15.10.2004 в 16:11. Причина: склероз... |
|
|
|
|
# 6 | |
|
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
Цитата:
Если про 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;
}
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.
__________________
Best Regards Последний раз редактировалось alexey_ma; 15.10.2004 в 17:04. |
|
|
|
|
|
# 7 |
|
Guest
Сообщения: n/a
|
Давайте сделаем попроще.
Дано: в какой-то проге контрол. Его classname='button', windowname='caption'. Найти: хэндл этого контрола. Примечание 'button' и 'caption' - реальные класс и имя контрола. Они зарание известны. Укого есть какие предложения, дайте, пожалуйста, код. Ещё раз всем спасибо. Последний раз редактировалось SolidSnake; 15.10.2004 в 18:04. |
|
|
# 8 |
|
Member
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245
![]() ![]() |
Если у тебя есть хендел главного окна в котором нужно искать ребенка то можешь сделать примерно так :
Код:
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); Надеюсь
__________________
Best Regards Последний раз редактировалось alexey_ma; 15.10.2004 в 20:46. |
|
|