Что нового

Двойной клик по Label

pvnn

Осваивающий
Сообщения
305
Репутация
32
Всем привет
Код (ниже) в принципе работает, но если сделать форму не активной, а потом произвести клик по Label срабатывает двойной клик, хотя не должен. Как это можно исправить?

Код:
#include <GUIConstants.au3>
#include <WindowsConstants.au3>
#include <WinApi.au3>

Global $hGUI = GUICreate("Double Click", 144, 144)
WinSetOnTop($hGUI,'',1)
Global $lblLabel = GUICtrlCreateLabel("Double click this!", 10, 10)
Global $hWnd_wndproc = DllCallbackRegister("NewWndProc", "ptr", "hwnd;uint;wparam;lparam")
Global $ptr_new_wndproc = DllCallbackGetPtr($hWnd_wndproc)
Global $ptr_old_wndproc = _WinAPI_SetWindowLong(GUICtrlGetHandle($lblLabel), $GWL_WNDPROC, $ptr_new_wndproc)

GUISetState(@SW_SHOW, $hGUI)

While (True)
    Switch (GUIGetMsg())
        Case $GUI_EVENT_CLOSE
            GUIDelete($hGUI)
            DllCallbackFree($hWnd_wndproc)
            Exit 0

;~         Case $lblLabel
;~             ConsoleWrite("Label clicked" & @LF)
    EndSwitch
WEnd

Func NewWndProc($hWndFrom, $iMsg, $wParam, $lParam)
    Switch $hWndFrom
        Case GUICtrlGetHandle($lblLabel)
            Switch $iMsg
                Case $WM_LBUTTONDBLCLK
                    ConsoleWrite("ButtonDBlclk" & @LF)
                    MsgBox("", "Double Click!", "You double clicked my label!")
				Case $WM_LBUTTONDOWN
                     ConsoleWrite("ButtonDown" & @LF)
            EndSwitch
    EndSwitch

    Return _WinAPI_CallWindowProc($ptr_old_wndproc, $hWndFrom, $iMsg, $wParam, $lParam)
EndFunc   ;==>NewWndProc
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
видимо, при активации формы идет клик, во всяком случае, функция так регистрирует момент активации окна. и тут ты еще делаешь клик по элементу.
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
joiner это все я вижу, не могу догнать как это пофиксить? есть варианты?
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
В твоем коде регистрируются все движения мыши над окном даже если оно не активно. Сделай активацию окна при наведении на него указателя мыши


Добавлено:
Сообщение автоматически объединено:

предлагаю так
декларируем глобальную переменную
Код:
Global $gtws

число 7 - окно активно
8 - неактивно
Код:
Func NewWndProc($hWndFrom, $iMsg, $wParam, $lParam)
	Switch $iMsg
		Case 7, 8
			$gtws = $iMsg
	EndSwitch
	Switch $hWndFrom
		Case GUICtrlGetHandle($lblLabel)
			Switch $iMsg
				Case $WM_LBUTTONDBLCLK
					If $gtws = 7 Then MsgBox("", "Double Click!", "You double clicked my label!")
			EndSwitch
	EndSwitch
	Return _WinAPI_CallWindowProc($ptr_old_wndproc, $hWndFrom, $iMsg, $wParam, $lParam)
EndFunc   ;==>NewWndProc
 
Автор
P

pvnn

Осваивающий
Сообщения
305
Репутация
32
joiner спасибо, работает решение
 
Верх