Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Call ReleaseCapture Call PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0) mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
ReleaseCapture();
PostMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);不要这段:if (e.Button == MouseButtons.Right)试试是不是右键也可以了
可能是因为只有PostMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
不够,这只是将你在客户区的WM_LBUTTONDOWN模拟成在非客户区WM_NCLBUTTONDOWN的标题栏HT_CAPTION上一般都是在lmousedown后Post这句,此时已经有LBUTTONDOWN的消息进来。而现在你点的是右键,没有LBUTTONDOWN的消息,可能就无效了。你试试先Post一句WM_LBUTTONDOWN,或者moust_event模拟左键按下看看行不行
PostMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);我感觉这一句的作用应该是:模拟鼠标点击标题栏,而不是模拟鼠标左键点击标题栏.
你说得我之前有测试过了,下边代码,都无效:
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ReleaseCapture();
PostMessage(Handle, WM_LBUTTONDOWN, 0, 0);//按下左键
PostMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
ReleaseCapture();
PostMessage(Handle, WM_RBUTTONUP, 0, 0); //释放右键
PostMessage(Handle, WM_LBUTTONDOWN, 0, 0);//按下左键
PostMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
用MoveWindow的话是可以,不过有个缺点就是在WIN7下会使窗口失去了触边感应功能,WIN7下拖动窗口当鼠标碰到屏幕边缘时会自动调整成某些预设位置和大小,这个挺实用的,不舍得舍弃.
Call ReleaseCapture
Call PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
Call ReleaseCapture
Call PostMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0End SubVB6测试成功,点下右键窗口可以跟着移动不过问题是,松开键盘或者右键后窗口仍粘在鼠标上,也就是说处在按住不放仍未松开的状态。我在MouseUp和KeyUp处理了未果,因为晚上有点事情无法做进一步的测试,楼主你可以继续试试,祝你好运。