Изменение фокуса ввода

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Изменение фокуса ввода

Сообщение IvanTheTerrible » 16.08.2007 (Чт) 10:46

Запущено некое чужое приложение. Фокус ввода располагается на каком-то из его контролов.

Каким образом (желательно посредством API) переместить фокус ввода на нужный мне контрол?

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 16.08.2007 (Чт) 10:50

Находишь как-нибудь hWnd контрола (например, FindWindow), затем через SendMessage посылаешь ему сообщение WM_SETFOCUS.
Salus populi suprema lex

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Сообщение IvanTheTerrible » 16.08.2007 (Чт) 10:57

2 dr.MIG

Пробовал так:

Public Sub ClickEnterButton()
SetForegroundWindow(WindowHwnd)
SendMessage EnterButtonHwnd, WM_SETFOCUS, 0&, 0&
SendMessage EnterButtonHwnd, BM_CLICK, 0&, 0&
End Sub

Не работает :(

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2007 (Чт) 11:03

By using the AttachThreadInput function, a thread can attach its input processing to another thread. This also allows threads to share their input states, so they can call the SetFocus function to set the keyboard focus to a window of a different thread.
Изображение

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 16.08.2007 (Чт) 11:13

Во-первых, точно ли переменные содержат хэндлы соответствующих окон.
Во-вторых, нафига SetForegroundWindow, если по описанию сообщение BM_CLICK может не сработать,если родительское окно кнопки не активно, поэтому не SetForegroundWindow, а SetActiveWindow.
В-третьих, нафига вообще WM_SETFOCUS, если надо кликнуть по кнопке.
Вот пример, но здесь клик происходит по кнопке собственного приложения.
Код: Выделить всё

Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal Msg As Long, wParam As Any, lParam As Any) As Long
Private Const BM_CLICK = &HF5

Private Sub Command1_Click()
    MsgBox "Aaaaaaa!"
End Sub

Private Sub Command2_Click()
    SendMessage Command1.hWnd, BM_CLICK, ByVal 0, ByVal 0
End Sub
Salus populi suprema lex

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Сообщение IvanTheTerrible » 16.08.2007 (Чт) 11:36

dr.MIG писал(а):Во-первых, точно ли переменные содержат хэндлы соответствующих окон.


Точно

dr.MIG писал(а):...нафига SetForegroundWindow, если по описанию сообщение BM_CLICK может не сработать,если родительское окно кнопки не активно, поэтому не SetForegroundWindow, а SetActiveWindow.


Проверено. Надо именнно SetForegroundWindow.

dr.MIG писал(а):...нафига вообще WM_SETFOCUS, если надо кликнуть по кнопке.


Согласен. Это я экспериментировал с бубном. :D

dr.MIG писал(а):...Вот пример, но здесь клик происходит по кнопке собственного приложения.


С кликами по контролам из собственного приложения я справляюсь. Проблема в том, что в чужом приложении контролы не стандартные (самописные). Там кнопка, собственно, и не кнопка, а скорее всего ImageBox. Но, не в этом даже дело...

Моя цель - найти универсальное решение. Буду пытаться "копать" подход, предложенный tyomitch.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 16.08.2007 (Чт) 11:45

IvanTheTerrible писал(а):Там кнопка, собственно, и не кнопка, а скорее всего ImageBox. Но, не в этом даже дело...

В случае с BM_CLICK как раз таки в этом...
Salus populi suprema lex

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Сообщение IvanTheTerrible » 16.08.2007 (Чт) 15:39

dr.MIG писал(а):В случае с BM_CLICK как раз таки в этом...


Признаю правоту.
Фокус менять/устанавливать научился. Осталось пока не ясно, какую константу слать
Код: Выделить всё
    SendMessage Hwnd, Константа_эквивалентная_мышиному_клику, 0&, 0&

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.08.2007 (Чт) 15:47

WM_LBUTTONDOWN, потом WM_LBUTTONUP
Изображение

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 16.08.2007 (Чт) 15:52

По идее, чтобы сымитировать мышиный клик, сначала надо послать WM_LBUTTONDOWN, а затем WM_LBUTTONUP.

Добавлено позже: да, с телефона постить неудобно... меня опередили :(
Последний раз редактировалось dr.MIG 16.08.2007 (Чт) 16:41, всего редактировалось 1 раз.
Salus populi suprema lex

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Сообщение IvanTheTerrible » 16.08.2007 (Чт) 16:17

Все!!! Разобрался.

Как только добавил установку курсора над нужным мне контролом, все заработало. Видимо, в том приложении, над которым я пляшу с бубном, внутри зашита проверка события MouseOverContol и Contol становится Enabled только после размещения над ним курсора (при этом, блин, внешне ничего не меняется).

dr.MIG и tyomitch, огромное спасибо!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 94

    TopList