雨林GG 发表于 2010-8-17 18:26:24

[已解决]如何获得窗口被拖动的消息?

本帖最后由 雨林GG 于 2010-8-17 21:02 编辑

如何获得窗口被拖动的消息?

xsjtxy 发表于 2010-8-17 18:51:52

本帖最后由 xsjtxy 于 2010-8-17 19:08 编辑

不是很科学。但是力所能及。。。无奈啊。
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

$Form1 = GUICreate("Form1", 633, 454, 192, 114,$WS_MAXIMIZEBOX+$WS_MINIMIZEBOX)
GUISetState(@SW_SHOW)

$a = WinGetPos($Form1)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                case $GUI_EVENT_PRIMARYUP
                        $b = WinGetPos($Form1)
                        if $a <> $b or $a <> $b then
                        msgbox(0,"","窗口被移动过")
                        endif
                        $a = WinGetPos($Form1)
                case $GUI_EVENT_MAXIMIZE
                        $a = WinGetPos($Form1)
                case $GUI_EVENT_RESTORE
                        $a = WinGetPos($Form1)
        EndSwitch
WEnd

pusofalse 发表于 2010-8-17 19:08:37

2#的是一种方法,也可以注册WM_MOVING消息。

雨林GG 发表于 2010-8-17 20:03:30

我的主循环主要实时接收TCP/UDP信息,而其他窗体全都用的事件模式,不想添加到主循环中了!先谢谢xsjtxy !
关于注册消息事件,俺是一窍不通! 哪儿有WM_MOVING的实例啊!? 先论坛找找去!谢谢P版 !

afan 发表于 2010-8-17 20:21:13

GUICreate('')
GUISetState()

GUIRegisterMsg(0x216, 'WM_MOVING')

While GUIGetMsg() + 3
        ToolTip('')
WEnd

Func WM_MOVING()
        ToolTip('窗口正在移动')
EndFunc   ;==>WM_MOVING

雨林GG 发表于 2010-8-17 20:52:39

谢谢 Afan

真是热心人 !

雨林GG 发表于 2010-8-17 21:00:43

OK,这个问题暂时解决! 下一步想得到窗体被托动后的位置!继续去想办法了!

afan 发表于 2010-8-17 21:02:55

回复 7# 雨林GG


    位置用 WinGetPos() 不就行了?

雨林GG 发表于 2010-8-17 21:06:22

回复 8# afan

可是要等托动窗体后,也就是松开鼠标才能用WingetPOS啊!

pusofalse 发表于 2010-8-17 21:08:59

WM_MOVING的lparam就是RECT指针,记录着XY坐标、宽度、高度信息,相当于WinGetPos。

雨林GG 发表于 2010-8-17 21:11:29

回复 10# pusofalse

多谢您的关注 !

pusofalse 发表于 2010-8-17 21:38:03

拖动窗口松开鼠标时,会发送WM_EXITSIZEMOVE (0x232) 消息,这个消息的wparam和lparam都是0,没有意义的2个参数,在消息函数中调用WinGetPos。

afan 发表于 2010-8-17 22:36:41

Global Const $tagRECT = 'int;int;int;int'
GUICreate('')
GUISetState()
GUIRegisterMsg(0x216, 'WM_MOVING')

While GUIGetMsg() + 3
        ToolTip('')
WEnd

Func WM_MOVING($hWnd, $iMsg, $iwParam, $ilParam)
        #forceref $hWnd, $iMsg, $iwParam
        Local $tBuffer, $L, $T, $R, $B
        $tBuffer = DllStructCreate($tagRECT, $ilParam)
        $L = DllStructGetData($tBuffer, 1)
        $T = DllStructGetData($tBuffer, 2)
        $R = DllStructGetData($tBuffer, 3)
        $B = DllStructGetData($tBuffer, 4)
        ToolTip('当前窗口位置:X = ' & $L & ', Y = ' & $T & ', W = ' & $R - $L & ', H = ' & $B - $T)
        $tBuffer = 0
EndFunc   ;==>WM_MOVING

hkc5599 发表于 2011-5-2 10:15:12

good example.thanks!!!!!!!!!!!!

紫色风林 发表于 2011-8-14 14:37:33

谢谢。学习了
页: [1] 2
查看完整版本: [已解决]如何获得窗口被拖动的消息?