IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   Еще немного о WinApi (https://www.imho.ws/showthread.php?t=34962)

Izzyy 23.07.2003 00:34

Еще немного о WinApi
 
Как с помощью ф-ций виндовс найти конрол на форме с заранее найденым хендлом этой формы, а потом сфокусировать ввод на контроле который мы нашли.

joker99 23.07.2003 01:35

что то типа етого:

CButton* btn=(CButton*)GetDlgItem(BUTTON_ID);
btn->SetFocus()

Насколько я помню, все контролы наследуют от CDialog, так что если не знаеш тип контрола:

CDialog* dlg=(CDialog*)GetDlgItem(BUTTON_ID);
dlg->SetFocus()

alexey_ma 23.07.2003 09:43

Kонтролы наследуют от CWnd.

Izzyy 23.07.2003 19:24

Ок, а если речь идет о Дельфи?

Izzyy 23.07.2003 19:31

Кроме того, что я спрашивал как я могу узнать ИД кнопки, а как установить фокус это был второстепенный вопрос. Зная хендел кнопки не так сложно (мне так кажется) установить ей фокус каки нибудь SendMessage or PostMessage.

alexey_ma 23.07.2003 20:51

Если ты хочешь найти кнопку в чужой апликации(не важно на чем написанной) и знаешь хендл формы то последовательность действий примерно такая:
(поиск по надписи на кнопке)
полчаешь хендл первого ребенка формы
HWND hChild = ::GetWindow(hParentWnd, GW_CHILD);
получаешь заголовок кнопки
char strCapt[255];
::GetWindowText(hChild,strCapt,254);
если это тот текст который тебе нужен то можешь ставить на этот хендл фокус.
если нет то идешь на следушего ребенка формы
hChild=::GetWindow(hChild,GW_HWNDNEXT);
опять проверяешь заголовок, и так пока не найдешь нужную тебе кнопку.

С фокусом все не так просто. Дело в том что,функция SetFocus(HWND hWnd) работает только для окон твоего потока. Если ты хочешь установить фокус на окно в в чужой апликации то сначала нужно присоединиться к очереди сообщений. Примерно так :

DWORD Tid=0;
DWORD MyTid=0;
Tid= ::GetWindowThreadProcessId(hWnd,NULL);
MyTid= ::GetWindowThreadProcessId(AfxGetApp()->m_pMainWnd->m_hWnd,NULL);
::AttachThreadInput(MyTid,Tid,TRUE);
::SetFocus(hWnd);
::AttachThreadInput(MyTid,Tid,FALSE);

где (AfxGetApp()->m_pMainWnd->m_hWnd --- твое окно.
hWnd --- найденное тобой окно на которое нужно установить фокус.

Izzyy 24.07.2003 00:16

Это обязательно? А в чем проблема послать сообщение чужой форме, которое установит фокус на кнопке?

alexey_ma 24.07.2003 10:06

Не обязательно. Для установки фокуса можно просто собщение заслать:
::PostMessage(pMainDlg->hCaptWnd ,WM_SETFOCUS,NULL,NULL);
В большенстве случаев будет работать.
Но чтобы из чужой апликации получить окно которое в фокусе придеться приатачиться. Посмотри в MSDN функции SetFocus и GetFocus.

Izzyy 24.07.2003 22:22

Ок. Но ведь есть же программы которые, эмулируют нажатие кнопки в чужих апликациях, значит и тут придумать, что-нибудь можно(кроме твоего первого решения). Например если мое предложение потеряет фокус и передаст его окну с нужным мне элементом, теоретически оно продолжить работать. Т.е. если я после того как сфокусирую ввод на нужном мне окне, мое преложение продолжит посылать сообщения таким образом позволит мне сфокусироваться на нужном мне элементе. Так вот и вопрос, что это за сообщение и как оно посылается?:atention:

alexey_ma 25.07.2003 17:16

Что ты хочешь сделать? Если хочешь просто установить фокус то тогда просто засылай WM_SETFOCUS, если хочешь сэмулировать нажатие мыши то посылай пару WM_LBUTTONDOWN и WM_LBUTTONUP или используй функцию mouse_event или SendInput.

georgebukki 25.07.2003 17:23

Вложений: 1
Если надо: Справочник по WinApi

alexey_ma 25.07.2003 17:37

Отстойный это справочник. Неполный и слишком кроткие не совсем точные описания . Лучше msdn нету ничего.

Izzyy 25.07.2003 21:06

секундочку, то что я написал, так можно делать или нет?
в смысле посылки сообщения и т.д.?

alexey_ma 25.07.2003 21:59

Нет. Если ты хочешь установить фокус на кнопку тебе придеться сначала определить хендл этой кнопки. Я не знаю такого сообщения (стандартного по крайней мере) которое ты можешь заслать форме а уже форма зафокусит кнопку. Хотя могут быть варианты, все зависит от программы с которой та собираешься работать. Например могут быть сообщения пользователя обработчик которых в форме устанавливает фокус на кнопку, или дефолтные кнопки на которые устанавливется фокус при активации приложения и т.п. Короче, нужно каждый конекретный случай рассматривать.
Мне по работе приходиться заниматься определением и опознанием контролов в чужих программах, можешь мне поверить что совсем универсального метода нет, и каждую аппликацию приходиться исследовать особо.


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

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