[已解决]如何获得窗口被拖动的消息?
本帖最后由 雨林GG 于 2010-8-17 21:02 编辑如何获得窗口被拖动的消息? 本帖最后由 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
2#的是一种方法,也可以注册WM_MOVING消息。 我的主循环主要实时接收TCP/UDP信息,而其他窗体全都用的事件模式,不想添加到主循环中了!先谢谢xsjtxy !
关于注册消息事件,俺是一窍不通! 哪儿有WM_MOVING的实例啊!? 先论坛找找去!谢谢P版 ! GUICreate('')
GUISetState()
GUIRegisterMsg(0x216, 'WM_MOVING')
While GUIGetMsg() + 3
ToolTip('')
WEnd
Func WM_MOVING()
ToolTip('窗口正在移动')
EndFunc ;==>WM_MOVING 谢谢 Afan
真是热心人 ! OK,这个问题暂时解决! 下一步想得到窗体被托动后的位置!继续去想办法了! 回复 7# 雨林GG
位置用 WinGetPos() 不就行了? 回复 8# afan
可是要等托动窗体后,也就是松开鼠标才能用WingetPOS啊! WM_MOVING的lparam就是RECT指针,记录着XY坐标、宽度、高度信息,相当于WinGetPos。 回复 10# pusofalse
多谢您的关注 ! 拖动窗口松开鼠标时,会发送WM_EXITSIZEMOVE (0x232) 消息,这个消息的wparam和lparam都是0,没有意义的2个参数,在消息函数中调用WinGetPos。 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 good example.thanks!!!!!!!!!!!! 谢谢。学习了
页:
[1]
2