Узнать, что кнопка мыши нажата (Да!)

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

Узнать, что кнопка мыши нажата (Да!)

Сообщение Mikle » 06.02.2013 (Ср) 13:56

Не сочтите сразу за "детский" вопрос. Поясняю:
Существует булевская переменная, запоминающая, что мышь нажали, при MouseDown и сбрасывающаяся по MouseUp. Но при быстром нажатии происходит DoubleClick вместо второго нажатия. Вот проверочный код:
Код: Выделить всё
Option Explicit

Dim M2Pressed As Boolean

Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = vbRightButton Then M2Pressed = True
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button = vbRightButton Then M2Pressed = False
End Sub

Private Sub Timer1_Timer()
  Caption = M2Pressed
End Sub

На форма таймер на 16 мс. Быстро нажмите, отпустите и снова нажмите правую кнопку.
Перевызов MouseDown из DoubleClick не годится, так как DoubleClick не различает нажатые кнопки. Неужели ради этой мелочи придётся прикручивать DirectInput?
Клики мимо формы меня не волнуют - это полноэкранное приложение, при потере-восстановлении фокуса состояния будут сбрасываться.

CyberPunk
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 23.06.2006 (Пт) 7:54

Re: Узнать, что кнопка мыши нажата (Да!)

Сообщение CyberPunk » 06.02.2013 (Ср) 14:31

На форма таймер на 16 мс. Быстро нажмите, отпустите и снова нажмите правую кнопку.
Перевызов MouseDown из DoubleClick не годится, так как DoubleClick не различает нажатые кнопки. Неужели ради этой мелочи придётся прикручивать DirectInput?
Клики мимо формы меня не волнуют - это полноэкранное приложение, при потере-восстановлении фокуса состояния будут сбрасываться.


Зачем при DoubleClick различать нажатые кнопки, если и так известно, что это левая (основная) кнопка?

Всю жизнь думал, что DoubleClick может быть только левой кнопкой, проверил, оказывается нет.. :shock: Sorry

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

Re: Узнать, что кнопка мыши нажата (Да!)

Сообщение Хакер » 06.02.2013 (Ср) 15:04

Mikle писал(а):Не сочтите сразу за "детский" вопрос.

Вопрос, тем не менее, детский, с точки зрения Windows-программирования :)

Если бы Windows писали те люди, которые делают её сейчас, наверняка было бы нужно привлекать DirectInput. К счастью 20 лет назад думали о другом.

Событие DblClick рэйсится в ответ на соответствующее сообщение. А соответствующее сообщение шлётся в ответ на реальный дабл-клик, вместо посылки пары MOUSE-сообщений. Эдакая фича. Отключаема ли она? К счастью да. На работу этой фичи играет стиль класса CS_DBLCLKS

Поэтому:
Код: Выделить всё
Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetClassLong Lib "user32" Alias "GetClassLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GCL_STYLE = (-26)
Private Const CS_DBLCLKS = &H8

    cs = GetClassLong(Me.hwnd, GCL_STYLE)
    cs = cs And Not CS_DBLCLKS
    SetClassLong Me.hwnd, GCL_STYLE, cs
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Узнать, что кнопка мыши нажата (Да!)

Сообщение Mikle » 06.02.2013 (Ср) 16:10

Благодарю! Всё отлично работает.


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

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

Сейчас этот форум просматривают: AhrefsBot и гости: 53

    TopList