C# 显示带有 WS_EX_NOACTIVATE 标志的表单

标签 c# winforms

我有一个无边框窗体,它总是在顶部并且设置了 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/

相关文章:

c# - 按字段复制对象

c# - 通过 sharpdx API 绘制和填充具有 4 个顶点(二维位置)的多边形

c# - 如何保护 WinForms 应用程序内部的 HTTP 流量免受嗅探

winforms - 将自定义视觉样式 (.msstyle) 应用到单个 Winforms 应用程序

c# - 我的应用程序如何查找旧版本的辅助文本文件?

c# - 如何获取图像文件的尺寸?

c# - 当所有后台线程池线程完成时得到通知

c# - 哪些 HTML 标签可用于在 Telegram Bot 上发送消息?

c# - C# 如何在另一个窗体中打开一个新窗口窗体

vb.net - 限制您可以在 Windows 窗体文本框中输入的字符数