我有一个无边框窗体,它总是在顶部并且设置了 WS_EX_NOACTIVATE
标志以防止它获得焦点。
const int WS_EX_NOACTIVATE = 0x08000000;
protected override CreateParams CreateParams {
get {
CreateParams param = base.CreateParams;
param.ExStyle |= WS_EX_NOACTIVATE;
return param;
}
}
表单包含用于移动的小图片框(因为它是无边框的):
private void pictureBox4_MouseMove(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
ReleaseCapture();
SendMessage(this.Handle, 0xa1, 0x2, 0);
}
}
但是,当我移动窗口时,它不会被重新绘制/显示,只有当我释放鼠标按钮时,它才会将窗体移动到新位置。
我见过以类似方式工作的应用程序,但它们确实会在移动时显示窗口(例如我见过的一些虚拟键盘)。我也在网上其他地方看到很多关于这个问题的问题,但没有答案。
有人可以告诉我是否可以在移动时显示这样的窗口/表单(如“普通”窗口),如果可以,该怎么做?
最佳答案
我想我已经找到了解决方案。如果有人可以检查是否一切都正确完成(与消息没有某种冲突),我将不胜感激。我已经将上面使用图片移动表单的代码更改为以下代码:
[DllImportAttribute("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInstertAfter, int x, int y, int cx, int cy, uint flags);
const int SWP_NOSIZE = 0x0001;
const int SWP_NOZORDER = 0x0004;
private void pictureBox4_MouseMove(object sender, MouseEventArgs e) {
if (e.Button == MouseButtons.Left) {
//ReleaseCapture();
//SendMessage(this.Handle, 0xa1, 0x2, 0);
SetWindowPos(Handle, IntPtr.Zero, this.Location.X + e.X,
this.Location.Y + e.Y, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
}
}
所以基本上我删除了这两个方法(函数)调用并用 SetWindowPos() 替换了它们。起初我遇到闪烁和定位不正确的问题,但后来我记得检查坐标是客户端坐标还是屏幕坐标...
关于C# 显示带有 WS_EX_NOACTIVATE 标志的表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2969680/