Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
 Аватар для Mikle Quits
1024 / 313 / 18
Регистрация: 21.01.2023
Сообщений: 552

Mouse Click мимо модальной формы

22.03.2023, 09:34. Показов 2475. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите, как узнать, что пользователь кликнул мышью мимо модальной формы?
События Form_Deactivate и Form_LostFocus не происходят, ведь форма модальная.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.03.2023, 09:34
Ответы с готовыми решениями:

MOUSE (Move, Click, DblClick) in VB????
Думал, что обойду этот вопрос используя встроенные в контролы Control_MouseMove и т.п.,но возникла ситуация, когда контролы не успевают...

Click, dbl click and move mouse
Всем привет! чего я хочу добиться: 1. чтобы при нажатии мыши на область с правой стороны окна и с левой происходили действия void...

Вызов модальной формы из модальной, нужно:закрытие последней и не закрытие первой.
1. Вызываю модальную форму из главной формы (немодальной). 2. Вызываю другую модальную форму из первой (п.1) модальной формы. 3....

26
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
27.03.2023, 14:12
Студворк — интернет-сервис помощи студентам
А я вот, с помощью программы WindowDetective, посмотрел сообщения немодального окна, при клике у меня получилось всего пару сообщений это WM_SETCURSOR и WM_WINDOWPOSCHANGING. Если отследить эти два сообщения вероятно мы и получим событие клика на немодальную форму.
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
27.03.2023, 14:20
Цитата Сообщение от testuser2 Посмотреть сообщение
при активации немодального окна
А у меня это лог при активации именно МОДАЛЬНОГО окна!!!
Миниатюры
Mouse Click мимо модальной формы  
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
27.03.2023, 15:03
А если кликать правой кнопкой мыши то уже WM_WINDOWPOSCHANGING даже нету сообщения. Остаётся только WM_SETCURSOR и всё.

Добавлено через 2 минуты
У меня неправильный подход наверное надо отлавливать события не немодальной (спящей) формы а наоборот модальной (активной) там тогда будет много сообщений оконных. Если отловить комбинацию таких сообщений то и будет клик на немодальной форме.

Добавлено через 26 минут
А лучше всего просто отслеживать клик на первой форме, или просто отслеживать потерю фокуса на второй форме и всё.
0
1412 / 878 / 93
Регистрация: 08.02.2017
Сообщений: 3,753
Записей в блоге: 2
27.03.2023, 15:49
Цитата Сообщение от HackerVlad Посмотреть сообщение
А у меня это лог при активации именно МОДАЛЬНОГО окна!!!
Да, именно модального, уже запутался )

Добавлено через 31 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
А лучше всего просто отслеживать клик на первой форме, или просто отслеживать потерю фокуса на второй форме и всё.
Для интереса скачал исходник Mikle Quits. Если ткнуть мимо окна такой ни чего не срабатывает, такой лог.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<000001> 001707C6 S WM_WINDOWPOSCHANGING lpwp:0018ED18
<000002> 001707C6 R WM_WINDOWPOSCHANGING
<000003> 001707C6 S WM_WINDOWPOSCHANGING lpwp:0018ED18
<000004> 001707C6 R WM_WINDOWPOSCHANGING
<000005> 001707C6 S WM_ACTIVATEAPP fActive:True dwThreadID:00000000
<000006> 001707C6 R WM_ACTIVATEAPP
<000007> 001707C6 S WM_NCACTIVATE fActive:True
<000008> 001707C6 R WM_NCACTIVATE
<000009> 001707C6 S WM_ACTIVATE fActive:WA_ACTIVE fMinimized:False hwndPrevious:(null)
<000010> 001707C6 S WM_IME_SETCONTEXT fSet:1 iShow:C000000F
<000011> 001707C6 S WM_IME_NOTIFY dwCommand:IMN_OPENSTATUSWINDOW dwCommand:00000002 dwData:00000000
<000012> 001707C6 R WM_IME_NOTIFY
<000013> 001707C6 R WM_IME_SETCONTEXT
<000014> 001707C6 S WM_SETFOCUS hwndLoseFocus:(null)
<000015> 001707C6 R WM_SETFOCUS
<000016> 001707C6 R WM_ACTIVATE
<000017> 001707C6 P message:0x105A [User-defined:WM_USER+3162] wParam:00000000 lParam:00000000
Добавлено через 13 минут
Клик правой кнопкой
Кликните здесь для просмотра всего текста
<000001> 001707C6 S WM_NCACTIVATE fActive:False
<000002> 001707C6 R WM_NCACTIVATE fDeactivateOK:True
<000003> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000004> 001707C6 S WM_NCACTIVATE fActive:True
<000005> 001707C6 R WM_NCACTIVATE
<000006> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000007> 001707C6 S WM_NCACTIVATE fActive:False
<000008> 001707C6 R WM_NCACTIVATE fDeactivateOK:True
<000009> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000010> 001707C6 S WM_NCACTIVATE fActive:True
<000011> 001707C6 R WM_NCACTIVATE
<000012> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000013> 001707C6 S WM_NCACTIVATE fActive:False
<000014> 001707C6 R WM_NCACTIVATE fDeactivateOK:True
<000015> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000016> 001707C6 S WM_NCACTIVATE fActive:True
<000017> 001707C6 R WM_NCACTIVATE
<000018> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000019> 001707C6 S WM_NCACTIVATE fActive:False
<000020> 001707C6 R WM_NCACTIVATE fDeactivateOK:True
<000021> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000022> 001707C6 S WM_NCACTIVATE fActive:True
<000023> 001707C6 R WM_NCACTIVATE
<000024> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000025> 001707C6 S WM_NCACTIVATE fActive:False
<000026> 001707C6 R WM_NCACTIVATE fDeactivateOK:True
<000027> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000028> 001707C6 S WM_NCACTIVATE fActive:True
<000029> 001707C6 R WM_NCACTIVATE
<000030> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000031> 001707C6 S WM_NCACTIVATE fActive:False
<000032> 001707C6 R WM_NCACTIVATE fDeactivateOK:True
<000033> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000034> 001707C6 S WM_NCACTIVATE fActive:True
<000035> 001707C6 R WM_NCACTIVATE
<000036> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000037> 001707C6 S WM_NCACTIVATE fActive:False
<000038> 001707C6 R WM_NCACTIVATE fDeactivateOK:True
<000039> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000040> 001707C6 S WM_NCACTIVATE fActive:True
<000041> 001707C6 R WM_NCACTIVATE
<000042> 001707C6 P message:0x0118 [Unknown] wParam:0000FFF8 lParam:00174644
<000043> 001707C6 S WM_NCACTIVATE fActive:False
<000044> 001707C6 R WM_NCACTIVATE fDeactivateOK:True
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
27.03.2023, 16:17
Я нашёл совершенно новое решение, основанное на оконных сообщениях. Теперь больше нет необходимости отслеживать все клики мышкой и проверять WindowFromPoint как я это делал раньше. Но есть один минус - нельзя узнать если клик произошёл мимо своего приложения. То есть отслеживается клик только на первой форме, даже во время того, как мы находимся на второй модальной форме.

Код первой формы:
Visual Basic
1
2
3
4
5
Option Explicit
 
Private Sub Command1_Click()
    Form2.Show vbModal
End Sub
Код второй формы:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit
 
Private Sub Form_Load()
    SetWndProc Form1.hwnd ' Отсубклассировать первую форму
End Sub
 
Private Sub Form_Unload(Cancel As Integer)
    TerminateWndProc Form1.hwnd ' Снять субклассирование
End Sub
 
' MouseDown на первой форме во время модальности!
Public Sub Form1MouseDown()
    Print "MouseDown во время модального окна"
End Sub
 
' MouseUp на первой форме во время модальности!
Public Sub Form1MouseUp()
    Print "MouseUp во время модального окна"
End Sub
Код модуля:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
Option Explicit
 
Private Const GWL_WNDPROC = -4&
Private Const WM_DESTROY As Long = &H2
Private Const WM_LBUTTONDOWN = &H201&
Private Const WM_SETCURSOR = &H20
 
' Объявления API-функций
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
 
Dim glPrevWndProc As Long
 
' Эта процедура заменит стандартную оконную процедуру на пользовательскую
Public Sub SetWndProc(hwnd As Long)
    glPrevWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WndProc)
End Sub
 
Public Sub TerminateWndProc(hwnd As Long)
    ' Снятие хука
    SetWindowLong hwnd, GWL_WNDPROC, glPrevWndProc
End Sub
 
' Пользовательская оконная процедура
Private Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case uMsg
        Case WM_DESTROY
            SetWindowLong hwnd, GWL_WNDPROC, glPrevWndProc
            
        Case WM_LBUTTONDOWN
            ' Этот параметр работает только когда нету на экране модальной формы
            
        Case WM_SETCURSOR ' А это сообщение работает даже во время модальности
            If lParam = &H201FFFE Then ' MouseDown во время модального окна
                Form2.Form1MouseDown
            End If
            If lParam = &H202FFFE Then ' MouseUp во время модального окна
                Form2.Form1MouseUp
            End If
    End Select
    
    ' Вызов оконной процедуры по умолчанию
    WndProc = CallWindowProc(glPrevWndProc, hwnd, uMsg, wParam, lParam)
End Function
Вложения
Тип файла: zip Mouse Click мимо модальной формы2.zip (6.5 Кб, 11 просмотров)
1
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
27.03.2023, 16:46
Забыл ещё сразу проверить правую кнопку мыши. Оказалось, что надо прописать ещё клик по правой кнопки мыши.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
' Пользовательская оконная процедура
Private Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case uMsg
        Case WM_DESTROY
            SetWindowLong hwnd, GWL_WNDPROC, glPrevWndProc
            
        Case WM_LBUTTONDOWN
            ' Этот параметр работает только когда нету на экране модальной формы
            
        Case WM_SETCURSOR ' А это сообщение работает даже во время модальности
            If lParam = &H201FFFE Then ' MouseDown левой кнопкой мыши во время модального окна
                Form2.Form1MouseDown
            End If
            If lParam = &H202FFFE Then ' MouseUp левой кнопкой мыши во время модального окна
                Form2.Form1MouseUp
            End If
            
            If lParam = &H204FFFE Then ' MouseDown правой кнопкой мыши во время модального окна
                Form2.Form1MouseDown
            End If
            If lParam = &H205FFFE Then ' MouseUp правой кнопкой мыши во время модального окна
                Form2.Form1MouseUp
            End If
    End Select
    
    ' Вызов оконной процедуры по умолчанию
    WndProc = CallWindowProc(glPrevWndProc, hwnd, uMsg, wParam, lParam)
End Function
0
Вернулся
 Аватар для HackerVlad
1782 / 677 / 46
Регистрация: 10.09.2021
Сообщений: 2,840
31.03.2023, 02:26
Цитата Сообщение от Mikle Quits Посмотреть сообщение
как среагируют на хук антивирусы и прочие защитники
ты оказался прав, антивирусы не любят различные хуки, и мышиный хук в моей программе перемещения окон вышел как вирус Тестирование полезных кодов и примеров там I Can написал по моему
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.03.2023, 02:26

Javascript mouse click
Пытаюсь сделать кое что на PHP + Javascript. Замысел такой что: на экране 2 кубика, например красный и желтый. и есть число point=0...

Mouse Click - Component
Доброго всем времени суток! У меня такая проблема! Не нашел в интернете примера кода который бы проверял ЗАЖАТА! Не Нажата а Зажата, левая...

Работа с Mouse.Click
Привет всем :) Как осуществить нажатие правой кнопкой мыши? В игре? Я пишу Анти-АФК бот и хотелось бы чтобы каждые 30 секунд нажималась...

Excel > click mouse > Telegram
Как создать гиперссылку в Excel, чтобы по клику ПКМ открывалась соответствующая ветка в Telegram. Сам Telegram на компе установлен и...

Не отрабатывается событие - Mouse Click
Из главной формы Form1 - создаю новую Form2 , на которой кнопки ToolStrip. События на click от этих кнопок - то проходят, то нет. На...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Новые блоги и статьи
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru