![]() |
Еще немного о WinApi
Как с помощью ф-ций виндовс найти конрол на форме с заранее найденым хендлом этой формы, а потом сфокусировать ввод на контроле который мы нашли.
|
что то типа етого:
CButton* btn=(CButton*)GetDlgItem(BUTTON_ID); btn->SetFocus() Насколько я помню, все контролы наследуют от CDialog, так что если не знаеш тип контрола: CDialog* dlg=(CDialog*)GetDlgItem(BUTTON_ID); dlg->SetFocus() |
Kонтролы наследуют от CWnd.
|
Ок, а если речь идет о Дельфи?
|
Кроме того, что я спрашивал как я могу узнать ИД кнопки, а как установить фокус это был второстепенный вопрос. Зная хендел кнопки не так сложно (мне так кажется) установить ей фокус каки нибудь SendMessage or PostMessage.
|
Если ты хочешь найти кнопку в чужой апликации(не важно на чем написанной) и знаешь хендл формы то последовательность действий примерно такая:
(поиск по надписи на кнопке) полчаешь хендл первого ребенка формы 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 --- найденное тобой окно на которое нужно установить фокус. |
Это обязательно? А в чем проблема послать сообщение чужой форме, которое установит фокус на кнопке?
|
Не обязательно. Для установки фокуса можно просто собщение заслать:
::PostMessage(pMainDlg->hCaptWnd ,WM_SETFOCUS,NULL,NULL); В большенстве случаев будет работать. Но чтобы из чужой апликации получить окно которое в фокусе придеться приатачиться. Посмотри в MSDN функции SetFocus и GetFocus. |
Ок. Но ведь есть же программы которые, эмулируют нажатие кнопки в чужих апликациях, значит и тут придумать, что-нибудь можно(кроме твоего первого решения). Например если мое предложение потеряет фокус и передаст его окну с нужным мне элементом, теоретически оно продолжить работать. Т.е. если я после того как сфокусирую ввод на нужном мне окне, мое преложение продолжит посылать сообщения таким образом позволит мне сфокусироваться на нужном мне элементе. Так вот и вопрос, что это за сообщение и как оно посылается?:atention:
|
Что ты хочешь сделать? Если хочешь просто установить фокус то тогда просто засылай WM_SETFOCUS, если хочешь сэмулировать нажатие мыши то посылай пару WM_LBUTTONDOWN и WM_LBUTTONUP или используй функцию mouse_event или SendInput.
|
Вложений: 1
Если надо: Справочник по WinApi
|
Отстойный это справочник. Неполный и слишком кроткие не совсем точные описания . Лучше msdn нету ничего.
|
секундочку, то что я написал, так можно делать или нет?
в смысле посылки сообщения и т.д.? |
Нет. Если ты хочешь установить фокус на кнопку тебе придеться сначала определить хендл этой кнопки. Я не знаю такого сообщения (стандартного по крайней мере) которое ты можешь заслать форме а уже форма зафокусит кнопку. Хотя могут быть варианты, все зависит от программы с которой та собираешься работать. Например могут быть сообщения пользователя обработчик которых в форме устанавливает фокус на кнопку, или дефолтные кнопки на которые устанавливется фокус при активации приложения и т.п. Короче, нужно каждый конекретный случай рассматривать.
Мне по работе приходиться заниматься определением и опознанием контролов в чужих программах, можешь мне поверить что совсем универсального метода нет, и каждую аппликацию приходиться исследовать особо. |
| Часовой пояс GMT +4, время: 02:41. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.