imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 15.10.2004, 11:37     # 1
SolidSnake
Guest
 
Сообщения: n/a

Lightbulb Написать прогу, которая будет нажимать кнопки в чужом окне

Помогите, серьёзная проблема. Мне надо прогу напсать, она должна нажимать на чужие Батоны (кнопки в чужом окне). Это можно сделать программно через посылку сообщения по Хендлу контрола. Я могу конечно вычислить хендля объекта под крысой, но это неудобно(каждый раз тыкать прогу носом в чужой контрол). Скажите, нельзя ли по хендлу окна вычислить хендлы его дочерних контролов. Причём, скажу сразу, в Винде их хендлы неизвестны, они не регистрируются и поиск через FindWindow бесполезен.
Зарание благодарен.
 
Старый 15.10.2004, 12:23     # 2
Rander
Junior Member
 
Регистрация: 16.08.2003
Сообщения: 71

Rander Известность не заставит себя ждатьRander Известность не заставит себя ждать
В таком случае и писать нечего есть программы автоматизаторы выполняющие заданные тобой последовательности действий.
Просто один раз проделываешь нужные манипуляции прога их записывает, а после повторяет один в один
Rander вне форума  
Старый 15.10.2004, 15:08     # 3
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Цитата:
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).
__________________
Best Regards

Последний раз редактировалось alexey_ma; 15.10.2004 в 15:11.
alexey_ma вне форума  
Старый 15.10.2004, 15:25     # 4
SolidSnake
Guest
 
Сообщения: n/a

Не-е-е-е!

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

alexey_ma

Спасибо большое за подсказку. Я только не пойму, что за параметр Child: HWND. Если не трудно, просвети, а?
 
Старый 15.10.2004, 15:56     # 5
Ghost
::VIP::
Звезда первого сезона
Молчун-2004
 
Аватар для Ghost
 
Регистрация: 24.08.2002
Сообщения: 1 575

Ghost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех ГуруGhost Отец (мать) всех Гуру
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 - параметр, который будет передаваться в эту функцию.
__________________
Действовать надо тупо и это лучшее доказательство нашей чистоты и силы!

Последний раз редактировалось Ghost; 15.10.2004 в 16:11. Причина: склероз...
Ghost вне форума  
Старый 15.10.2004, 16:58     # 6
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Цитата:
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.
__________________
Best Regards

Последний раз редактировалось alexey_ma; 15.10.2004 в 17:04.
alexey_ma вне форума  
Старый 15.10.2004, 18:02     # 7
SolidSnake
Guest
 
Сообщения: n/a

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

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

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

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

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

Последний раз редактировалось SolidSnake; 15.10.2004 в 18:04.
 
Старый 15.10.2004, 20:43     # 8
alexey_ma
Member
 
Регистрация: 10.03.2002
Адрес: Israel
Сообщения: 245

alexey_ma Нимб уже пробиваетсяalexey_ma Нимб уже пробивается
Если у тебя есть хендел главного окна в котором нужно искать ребенка то можешь сделать примерно так :
Код:
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.
alexey_ma вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


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




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