Не передавать фокус форме при клике мыши

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

Не передавать фокус форме при клике мыши

Сообщение caa2000 » 03.04.2021 (Сб) 11:02

Здравствуйте.
Делаю экранную клавиатуру.
Есть массив command buttons. С клавишами клавиатуры всё нормально.
А вот когда кликаешь мышью, при клике на button фокус хоть на короткое время, но передаётся на форму, в следствии чего иногда слетает с активного окна.

Код: Выделить всё
Private Declare Sub keybd_event Lib "user32" _
    (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
.................
Private Sub Timer1_Timer() 'timer interval = 1
................
hAppWnd = GetForegroundWindow()  '  hwnd к примеру notepad
..............................
End Sub

Private Sub cmdKey_MouseDown(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single)  'в этот момент фокус переходит к Form1 ?
hAppWndEx = hAppWnd
ret = SetForegroundWindow(hAppWndEx) 'опять фокус на notepad
keybd_event Index, 0, 0, 0
keybd_event Index, 0, KEYEVENTF_KEYUP, 0
End Sub


Всё нормально, событие передаётся в notepad, но иногда фокус спрыгивает на форму,
что очень неприятно.
Возможно-ли, чтобы форма вообще не принимала фокус при клике ?
Типа Windows onscreen keyboard
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование

Old_Maple
Обычный пользователь
Обычный пользователь
 
Сообщения: 54
Зарегистрирован: 25.10.2016 (Вт) 12:03

Re: Не передавать фокус форме при клике мыши

Сообщение Old_Maple » 03.04.2021 (Сб) 18:42

caa2000, попробуй использовать это.
Код: Выделить всё
Public Declare Function GetActiveWindow Lib "user32" () As Long
Public Declare Function SetActiveWindow Lib "user32" (ByVal hWnd As Long) As Long
Veritas est aeterna!

caa2000
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 14.05.2009 (Чт) 4:50

Re: Не передавать фокус форме при клике мыши

Сообщение caa2000 » 03.04.2021 (Сб) 19:08

К сожалению то-же самое получается.
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Не передавать фокус форме при клике мыши

Сообщение Mikle » 03.04.2021 (Сб) 19:16

А если отказаться от использования событий, типа MouseDown или Click, никаких кнопок, опрашивать мышь через винапи?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Не передавать фокус форме при клике мыши

Сообщение alibek » 03.04.2021 (Сб) 22:38

Lasciate ogni speranza, voi ch'entrate.

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Не передавать фокус форме при клике мыши

Сообщение bon818 » 04.04.2021 (Вс) 12:01

alibek писал(а):https://stackoverflow.com/questions/13069717/letting-the-mouse-pass-through-windows-c

Не пойдет. События мыши будут передаваться в другие окна, расположенные под многослойным окном.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Не передавать фокус форме при клике мыши

Сообщение Хакер » 04.04.2021 (Вс) 13:07

Во-всех подобных случаях, когда непонятно, как сделать то или иное поведение, но есть программа, которая это поведение успешно реализует, я начиная с того, что беру Dependency Walker и смотрю, какие API-функции использует программа, и ищу «интересные», которые могут иметь отношение к делу.

У приложения экранной клавиатуры такие интересности есть.

Если этого недостаточно и по прежнему непонятно, как с помощью таких-то и таких-то API-функций добиться желаемого, вторым шагом берётся отладчик и высняется, как именно и что происходит.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Old_Maple
Обычный пользователь
Обычный пользователь
 
Сообщения: 54
Зарегистрирован: 25.10.2016 (Вт) 12:03

Re: Не передавать фокус форме при клике мыши

Сообщение Old_Maple » 04.04.2021 (Вс) 13:22

bon818, либо я чего-то не понял, либо ты не так объяснил...
Твоя экранная клавиатура, как ни крути, это "окно".
Поставь внутри цикл do.... DoEvents.... While (условие). И проверяй в этом цикле "фокус" своего "окна" через функцию GetActiveWindow. Если "фокус" выскочил из окна, отправляй "фокус" в свое "окно" с экранной клавиатурой посредством функции SetActiveWindow. Выход из цикла do.... DoEvents.... While (условие) и "окна" осуществляй сочетанием горячих клавиш.
Veritas est aeterna!

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Не передавать фокус форме при клике мыши

Сообщение Хакер » 04.04.2021 (Вс) 16:09

Old_Maple писал(а):do.... DoEvents.... While (условие).

И получить загрузку одного из ядер близкую к 100%. Ох уж эти вредные советы.

Правильная экранная клавиатура не должна отнимать фокус у рядовых окон, а не отнимать и тут же возвращать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: Не передавать фокус форме при клике мыши

Сообщение ger_kar » 04.04.2021 (Вс) 18:18

Хакер писал(а):Если этого недостаточно и по прежнему непонятно, как с помощью таких-то и таких-то API-функций добиться желаемого, вторым шагом берётся отладчик и высняется, как именно и что происходит.
У меня получалось только в основном при помощи отладчика, так как зачастую используемые WinAPI функции подгружаются динамически через LoadLibrary.
Также может помочь Spy++ c помощью этой утилиты можно посмотреть структуру окон и по мониторить оконные сообщения.
Кстати есть утилита, которая мониторит вызов функций и выводит информацию в лог. Напрочь забыл, как она называется. Но если задаться целью, то можно будет найти. На Windows XP такая утилита хорошо работала, а вот будет ли работать на новых системах не знаю.
Бороться и искать, найти и перепрятать

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Не передавать фокус форме при клике мыши

Сообщение The trick » 04.04.2021 (Вс) 19:12

Код: Выделить всё
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOREDRAW Or SWP_NOSIZE
    SetWindowLong Me.hwnd, GWL_EXSTYLE, GetWindowLong(Me.hwnd, GWL_EXSTYLE) Or WS_EX_NOACTIVATE Or WS_EX_TOOLWINDOW
UA6527P

bon818
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 267
Зарегистрирован: 29.08.2009 (Сб) 4:49
Откуда: Ташкент

Re: Не передавать фокус форме при клике мыши

Сообщение bon818 » 04.04.2021 (Вс) 21:03

The trick писал(а):
Код: Выделить всё
    SetWindowPos Me.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE Or SWP_NOMOVE Or SWP_NOREDRAW Or SWP_NOSIZE
    SetWindowLong Me.hwnd, GWL_EXSTYLE, GetWindowLong(Me.hwnd, GWL_EXSTYLE) Or WS_EX_NOACTIVATE Or WS_EX_TOOLWINDOW


WS_EX_NOACTIVATE Точно! Стили рулят)

caa2000
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 14.05.2009 (Чт) 4:50

Re: Не передавать фокус форме при клике мыши

Сообщение caa2000 » 04.04.2021 (Вс) 21:39

The trick !
You are super !!!!
Спасибо всем, кто откликнулся.
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 39

    TopList