SendMessage截去了鼠标信息怎么办?

ocean9b 2009-10-30 05:19:27
我在做一个无无边框窗体的时候,鼠标信息被MouseDown中的SendMessage截去了,鼠标左键放开的时候不能响应MouseUp事件(双击鼠标左键或放开鼠标右键才能响应MouseUp事件)。
请问怎么样才能实现鼠标左键放开时响应MouseUp事件???
谢谢!

'拖动无边框窗体
Private Sub Lab_title_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
Call ReleaseCapture
Call SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
End If
End Sub

'保存坐标
Private Sub Lab_title_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

保存坐标代码...

End Sub
...全文
268 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
aschcbao 2009-11-07
  • 打赏
  • 举报
回复
来看看了!
ocean9b 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 chenjl1031 的回复:]
VB codePrivateSub Form_MouseMove(ButtonAsInteger, ShiftAsInteger, XAsSingle, YAsSingle)Dim rAsLongDim iAsLongOnErrorResumeNextIf Button=1Then
i= ReleaseCapture()If i>0Then
r= ¡­
[/Quote]

这个可以了,不好意思,我理解错了,以为MouseMove过程中会不断循环调用,所以觉得MsgBox ("X=" & X & " " & "Y=" & Y)会调用很多次。
舉杯邀明月 2009-11-04
  • 打赏
  • 举报
回复
试试这个:
Option Explicit
在通用节加上这两句:
Private Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Private Const MOUSEEVENTF_LEFTDOWN = &H2 ' left button down

Private Sub Lab_title_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = vbLeftButton Then
Call ReleaseCapture
Call SendMessage(Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 1, 0 '在这里加上这句
End If
End Sub

'保存坐标
Private Sub Lab_title_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)

' 保存坐标代码...

End Sub

东方之珠 2009-11-04
  • 打赏
  • 举报
回复
说明:上面13楼这个代码的效果是移动窗体,松开鼠标左键时正好弹出MsgBox对话框!
getemail 2009-11-04
  • 打赏
  • 举报
回复
定时取得窗体位置.并检查是不是改变了,如果改变了就保存
GetWindowRect
[Quote=引用 3 楼 ocean9b 的回复:]
如果用定时保存的话是可以,但我觉得不是很好。
有没有可以在窗体移动或者更改大小后,自动保存窗体的位置和大小的方法或思路。
[/Quote]
东方之珠 2009-11-04
  • 打赏
  • 举报
回复
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim r As Long
Dim i As Long
On Error Resume Next
If Button = 1 Then
i = ReleaseCapture()
If i > 0 Then
r = SendMessage(Form1.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
'在这里保存你需要的数据
MsgBox ("X=" & X & " " & "Y=" & Y)
End If
End If
End Sub
东方之珠 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ocean9b 的回复:]
引用 5 楼 chenjl1031 的回复:
你方法不对,拖动窗体的代码应该写在MouseMove事件中,而不是MouseDown事件中:

VB codeOptionExplicitPrivate DeclareFunction ReleaseCapture Lib"user32" ()AsLongPrivate DeclareFunction SendMessage Lib"user32" Alias"SendMessageA" (ByVal hwndAsLong, ByVal wMsgAsLong, ByVal wParamAsLong, lParamAs Any)AsLongPrivateConst HTCAPTION=2PrivateConst WM_NCLBUTTONDOWN=&HA1PrivateSub Form_Mousemove(ButtonAsInteger, ShiftAsInteger, XAsSingle, YAsSingle)Dim rAsLongDim iAsLongOnErrorResumeNextIf Button=1Then
          i= ReleaseCapture()If i>0Then
              r= SendMessage(Form1.hwnd, WM_NCLBUTTONDOWN, HTCAPTION,0)EndIfEndIfEnd SubPrivateSub Form_MouseUp(ButtonAsInteger, ShiftAsInteger, XAsSingle, YAsSingle)
        Debug.Print X, YEnd Sub


你好!我照你的方法试了,单击窗体的时候是可以触发MouseUp事件,但我按下鼠标左键移动窗体后放开鼠标左键的时候触发不了MouseUp事件!
[/Quote]

你怎么就那么笨呢?

在SendMessage的下面保存数据,写上一行:
MsgBox ("X=" & X & " " & "Y=" & Y)
ocean9b 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 tiger_zhao 的回复:]
运行中的窗体坐标和大小直接访问窗体对象即可取得,不需要保存。
只要在 Unload 事件中进行保存即可。
[/Quote]

窗体移动或大小改变后保存是为了防址电脑死机或者程序不正常退出的情况,所以要在改变后保存到硬盘。
Tiger_Zhao 2009-11-04
  • 打赏
  • 举报
回复
运行中的窗体坐标和大小直接访问窗体对象即可取得,不需要保存。
只要在 Unload 事件中进行保存即可。
jhone99 2009-11-04
  • 打赏
  • 举报
回复
me.tag= me.legt & "," & me.top & "," & me.width & "," & me.height

使用
dim a() as double
a=split(me.tag,",")
ocean9b 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chenjl1031 的回复:]
你方法不对,拖动窗体的代码应该写在MouseMove事件中,而不是MouseDown事件中:

VB codeOptionExplicitPrivate DeclareFunction ReleaseCapture Lib"user32" ()AsLongPrivate DeclareFunction SendMessage Lib"user32" Alias"SendMessageA" (ByVal hwndAsLong, ByVal wMsgAsLong, ByVal wParamAsLong, lParamAs Any)AsLongPrivateConst HTCAPTION=2PrivateConst WM_NCLBUTTONDOWN=&HA1PrivateSub Form_Mousemove(ButtonAsInteger, ShiftAsInteger, XAsSingle, YAsSingle)Dim rAsLongDim iAsLongOnErrorResumeNextIf Button=1Then
i= ReleaseCapture()If i>0Then
r= SendMessage(Form1.hwnd, WM_NCLBUTTONDOWN, HTCAPTION,0)EndIfEndIfEnd SubPrivateSub Form_MouseUp(ButtonAsInteger, ShiftAsInteger, XAsSingle, YAsSingle)
Debug.Print X, YEnd Sub
[/Quote]

你好!我照你的方法试了,单击窗体的时候是可以触发MouseUp事件,但我按下鼠标左键移动窗体后放开鼠标左键的时候触发不了MouseUp事件!
ocean9b 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jhone99 的回复:]
引用 3 楼 ocean9b 的回复:
如果用定时保存的话是可以,但我觉得不是很好。
有没有可以在窗体移动或者更改大小后,自动保存窗体的位置和大小的方法或思路。


换个思路,其实每次窗体移动或者更改大小后,保存,下次窗体移动或者更改大小就可以利用了(最初的在load时记录)
[/Quote]

你好!关键是每次窗体移动或者更改大小后怎样保存,尽量减少CUP的开销和硬盘的写入。
getemail 2009-11-04
  • 打赏
  • 举报
回复
学习
东方之珠 2009-11-04
  • 打赏
  • 举报
回复
你方法不对,拖动窗体的代码应该写在MouseMove事件中,而不是MouseDown事件中:

Option Explicit

Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const HTCAPTION = 2
Private Const WM_NCLBUTTONDOWN = &HA1

Private Sub Form_Mousemove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim r As Long
Dim i As Long
On Error Resume Next
If Button = 1 Then
i = ReleaseCapture()
If i > 0 Then
r = SendMessage(Form1.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
End If
End If
End Sub

Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
Debug.Print X, Y
End Sub
jhone99 2009-11-04
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ocean9b 的回复:]
如果用定时保存的话是可以,但我觉得不是很好。
有没有可以在窗体移动或者更改大小后,自动保存窗体的位置和大小的方法或思路。
[/Quote]

换个思路,其实每次窗体移动或者更改大小后,保存,下次窗体移动或者更改大小就可以利用了(最初的在load时记录)
ocean9b 2009-11-04
  • 打赏
  • 举报
回复
如果用定时保存的话是可以,但我觉得不是很好。
有没有可以在窗体移动或者更改大小后,自动保存窗体的位置和大小的方法或思路。
linmei19840721 2009-10-30
  • 打赏
  • 举报
回复
来学习
booksoon 2009-10-30
  • 打赏
  • 举报
回复
帮顶~~~

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧