Winforms - 单击控件的 WM_NCHITEST 消息

2023-12-02

我有一个简单的窗口窗体,没有边框和几个标签控件(不需要单击任何内容)。我需要能够允许用户通过单击表单上的任意位置来移动表单,所以我发现this问题,并使用了在那里找到的以下代码。

    private const int WM_NCHITTEST = 0x84;
    private const int HTCLIENT = 0x1;
    private const int HTCAPTION = 0x2;

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg) {
            case WM_NCHITTEST:
                base.WndProc(ref m);

                if ((int)m.Result == HTCLIENT) {
                    m.Result = (IntPtr)HTCAPTION;
                    return;
                } else {
                    return;
                }
                break;
        }
        base.WndProc(ref m);            
    }

在某种程度上,这很有效。如果我单击表单本身的任意位置(背景),WM_NCHITTEST is HTCLIENT,这样我就可以按预期移动我的表单。但是,如果我单击标签控件本身,则消息会有所不同,并且我无法分辨它是什么。

I found 本文关于各种可能的值WM_NCHITTEST但它们似乎都不是我所需要的。

我意识到我可以禁用所有标签控件,这将允许我单击“它们”,就好像它是表单本身一样,但我想知道是否有更好/不同的方法来做到这一点。

谢谢您的帮助!


你正在覆盖WndProc对于表单,但是当光标位于标签上时WM_NCHITTEST消息被发送到标签。

您可以创建自己的标签控件,派生自Label并覆盖它的WndProc。这应该总是返回HTTRANSPARENT回应WM_NCHITTEST。就像是:

private const int HTTRANSPARENT = -1;

protected override void WndProc(ref Message m)
{
    switch (m.Msg)
    {
        case WM_NCHITTEST:
            m.Result = (IntPtr)HTTRANSPARENT;
            return;
    }
    base.WndProc(ref m);
}

另请注意,您的程序中有一个小错误WndProc。如果消息是WM_NCHITTEST但该地区不是HTCLIENT然后你调用基类两次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Winforms - 单击控件的 WM_NCHITEST 消息 的相关文章

  • 无法在表适配器配置属性中找到对象“Web.config”的连接“MyConnName”

    I want to change the query in table adapter but it s not opening throwing an error Configure table Adapter Failed in pro
  • 为什么在 OpenCV 中访问该矩阵时出现内存错误?

    我只是想写入给定大小的矩阵 当我在 Valgrind 中运行该程序时 出现内存错误 如下所示 主要 cpp include
  • 在 Visual Studio 2012 Express 上通过 Nuget 的 NUnit.Runners 不起作用

    我正在尝试使用 NuGet 管理器在 Visual Studio 2012 Express 中设置简单的 NUnit 项目 从 PROJECT gt Manage NuGet Packages 我安装了 NUnit 框架 并想要添加 NUn
  • 不能使用函数名称距离

    以下代码可以正常编译 include
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • std::async 参数的生命周期是多少?

    看来函数的参数是通过std async分享未来的生活 include
  • 通过 EUSART PIC18F45K80 打印消息

    我正在尝试向 Docklight 发送串行消息 但始终收到空值 我正在使用带有 XC8 MPLAB X 的 PIC18F45K80 我的代码中的所有内容似乎都是正确的 但我想我错了 我该如何修复它 include
  • 对无符号 8 位整数进行左移操作 [重复]

    这个问题在这里已经有答案了 我试图理解 C C 中的移位运算符 但它们给我带来了困难 我有一个无符号 8 位整数 初始化为一个值 例如 1 uint8 t x 1 根据我的理解 它在内存中的表示方式如下 0 0 0 0 0 0 0 1 现在
  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • .NET:SqlDataReader.Close 或 .Dispose 导致超时过期异常

    当尝试在 SqlDataReader 上调用 Close 或 Dispose 时 我收到超时过期异常 如果您有到 SQL Server 的 DbConnection 您可以使用以下命令自行重现它 String CRLF r n String
  • 在 C++ 中初始化指针

    可以在声明时将指针分配给值吗 像这样的东西 int p 1000 是的 您可以在声明时初始化指向值的指针 但是您不能这样做 int p 1000 是个地址运算符 并且您不能将其应用于常量 尽管如果可以 那会很有趣 尝试使用另一个变量 int
  • 二维数组的列求和

    我有一个IEnumerable
  • 使用 C# 和 .NET Core 在 AWS Cognito 用户池中进行用户管理

    如何使用 C 和 NET Core 3 x 管理 AWS Cognito 用户池中的用户 在文档中找不到有关它的任何内容 Attilio Gelosa 的原创文章 我写这篇文章是希望对其他人有帮助 我必须阅读一页又一页的文档 并从 AWS
  • C++ 中类型信息何时向后流动?

    我刚刚看了 Stephan T Lavavej 的演讲CppCon 2018关于 类模板参数推导 在哪里某个点 https youtu be H ut6j1BYU t 941他顺便说 在 C 中 类型信息几乎永远不会向后流动 我不得不说 几
  • 为什么我从 c# 到 js 得到不同的 MD5 哈希值?

    我有一个用于加密密码的 C 函数 System Security Cryptography MD5CryptoServiceProvider md5Provider new System Security Cryptography MD5C
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域
  • C# 或 Windows 相当于 OS X 的 Core Data?

    我迟到了 现在才开始在 OS X Cocoa 中使用 Core Data 它令人难以置信 并且确实改变了我看待事物的方式 C 或现代 Windows 框架中是否有等效的技术 即拥有可免费保存 数据管理 删除 搜索的托管数据类型 还想知道Li
  • 不兼容的指针到字符转换

    我正在编写一个程序 将卡片值写入 52 个点字符的多维数组中 该程序是一个测试数组 稍后我将其作为函数写入主程序中 在程序中 我通过以下方式初始化 for 循环计数0通过51 我用一个switch语句调制13将卡牌值分配给数组点 但是 我收
  • 在标准 C 中将 int 转换为 string

    我是 C 新手 我正在寻找一个可以调用函数进行转换的示例int串起来 我发现itoa但这不是标准 C 的一部分 我还发现sprintf str d aInt 但问题是我不知道所需的 str 的大小 因此 我如何传递输出字符串的正确大小 有多
  • 使用 Crypto++ 和 .NET 的 CFB 模式下的 TripleDES

    我正在尝试使用 TripleDES 使用 C 应用程序获得相同的结果 该应用程序具有Crypto https www cryptopp com 和 NET应用程序使用三重DESCryptoServiceProvider https msdn

随机推荐

  • 需要 C# 中的多重继承功能。我究竟做错了什么?

    class UDPClient class LargeSimulator class RemoteLargeSimulatorClient UDPClient LargeSimulator 俗话说 如果您需要多重继承 那么您的设计就失败了
  • Nodejs中从绝对路径获取文件名?

    如何从 Nodejs 中的绝对路径获取文件名 e g foo txt from var www foo txt 我知道它适用于字符串操作 例如fullpath replace 但我想知道是否有一个明确的方法 比如file getName 在
  • 在Python psutil中调用函数时如何监控CPU的使用情况?

    嘿 我正在学习 psutil 软件包 我想知道如何在函数运行时显示当前的 CPU 使用情况 我想我需要一些线程或类似的东西 但是该怎么做呢 谢谢你的回答 import psutil import random def iHateThis t
  • 来自 Youtube API 的 OAUTH 凭证无效

    我尝试在 OAuth 2 0 Playground 中使用 Youtube API 时收到 401 Invalid Credentials 错误 回应是 error code 401 message Invalid Credentials
  • 在 python3.3 上安装 numpy - 为 python3 安装 pip

    对于 python 3 2 我使用sudo apt get install python3 2 numpy 有效 python3 3怎么办 我想不出任何办法 scipy 等也是如此 谢谢 编辑 这就是它的样子 radu sunlit ins
  • 从 chrome.storage.sync 保存和检索

    我试图将数据对象保存在 chrome 同步存储中 然后检索它 但是 get 函数始终返回一个空对象 我使用的代码是 function storeUserPrefs var key myKey testPrefs val 10 chrome
  • Hibernate envers - 如何仅存储更新的值

    我正在使用 Hibernate Envers 进行审核 更新后和插入后效果很好 我有一个要求 我只需要审核审核表中更新的列 例如employee aud 默认情况下 envers 会将整个持久化实体插入到审计表中 我只需要插入更新的值 有可
  • Apache POI HSSF 流媒体

    有没有办法像新的 SXSSF 流 API 一样使用或实现 XLS 流 我需要处理巨大的 XLS 和 XLSX 电子表格 但由于它们的 HSSF 没有任何可用的流 我总是遇到堆空间问题 达到 1GB 并出现错误 有人对 POI 有什么建议吗
  • Matlab:分离连接的组件

    我正在研究检测硬币的图像处理问题 I have some images like this one here 并想将错误连接的硬币分开 我们已经尝试了 MATLAB 主页上所述的分水岭方法 the watershed transform s
  • setInterval 中的当前时间?

    setInterval function var current getCurrentInterval alert current 2000 可以查吗 没有什么可以给你 当前 间隔 因为可能有几个不同的计时器在运行 你最好自己构建Timer
  • swift 3:创建材料设计芯片

    heyhey 这几天我尝试创建 材料设计芯片 但只成功了一半 我最成功的尝试是从 Button 创建一个子类 Button 是从 UIButton 创建的子类 宇宙心智在他的 MaterialDesign Framework for swi
  • 如何刷新 Eclipse View 插件

    我根据 Eclipse 插件视图教程创建了一个简单的视图 我添加了允许我的插件监听调试器上的更改的功能 我的问题是 每当调试器上发生某些事情时 我希望刷新我的视图并使用新信息进行更新 这是我所拥有的 我正在尝试的 public void c
  • jQuery - 表单仍然提交并返回 false

    http jsfiddle net QsTfc 由于某种奇怪的原因 即使我返回 false 表单仍继续提交 我努力了 submitEdit submit function return false submitEdit submit fun
  • 在 Linux 下,在连接线程上调用 pthread_cancel 会导致段错误

    以下代码在第一次调用 pthread cancel 时以分段错误结束 但仅限在 Linux 下 Mac OS 下运行良好 我是否不允许在已完成运行的线程上调用 pthread cancel 也许我根本不应该调用 pthread cancel
  • 我怎样才能在js中导入东西? (不和谐.js)

    我在 js 中为不和谐机器人导入时遇到问题 这是我的代码的一部分 import as Discord from discord js import as fs from fs import config from config json c
  • 无法使用 Kingfisher 显示 url 中的图像

    我进口的是翠鸟 import UIKit import Kingfisher 这是我的简单代码可以解释问题创建 imageView 并尝试从 URL 显示图像 class ViewController UIViewController IB
  • AngularJS 不会显示(解析)Laravel5 中通过 $http.get 传递的数据

    我有一个简单的SPA应用程序 只是为了Laravel 5 中如何从数据库中获取一些数据 并且对于前端我在用着AngularJS 我的角度文件都在public文件夹 当我去本地主机我得到的不是用户列表 而是字面意思 user1 name us
  • 散景服务器的简单用户名和密码保护

    我有一个简单的散景服务器应用程序 我想将其公开在基于 Linux 的 Azure 节点上 服务器已启动并正在运行 我的问题是 如何通过用户名和密码保护内容 我不一定需要对用户进行身份验证 到目前为止我的想法 没试过 可能行不通 创建带有文本
  • AngularJS 指令 templateUrl 不更新

    我对角度指令有疑问 当我编辑通过引用的文件的内容时templateUrl 直到我删除缓存后才出现结果 我有以下代码 指令 js directive appMainsec window function window var objectMa
  • Winforms - 单击控件的 WM_NCHITEST 消息

    我有一个简单的窗口窗体 没有边框和几个标签控件 不需要单击任何内容 我需要能够允许用户通过单击表单上的任意位置来移动表单 所以我发现this问题 并使用了在那里找到的以下代码 private const int WM NCHITTEST 0