惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
GbyAI
GbyAI
Y
Y Combinator Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
博客园_首页
小众软件
小众软件
I
InfoQ
J
Java Code Geeks
月光博客
月光博客
S
Secure Thoughts
Microsoft Security Blog
Microsoft Security Blog
V
Visual Studio Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Stack Overflow Blog
Stack Overflow Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Cloudflare Blog
T
Threat Research - Cisco Blogs
A
About on SuperTechFans
H
Help Net Security
MongoDB | Blog
MongoDB | Blog
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Latest news
Latest news
G
GRAHAM CLULEY
IT之家
IT之家
C
Cisco Blogs
Last Week in AI
Last Week in AI
Engineering at Meta
Engineering at Meta
L
LangChain Blog
The Register - Security
The Register - Security
SecWiki News
SecWiki News
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
T
Tenable Blog
博客园 - Franky
美团技术团队
I
Intezer
U
Unit 42
雷峰网
雷峰网
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
SegmentFault 最新的问题
C
Cyber Attacks, Cyber Crime and Cyber Security

博客园 - 曲滨*銘龘鶽

IE8 隐藏命令行参数 学习 ASP.NET mvc 第一天、也可能是最后一天 Visual Studio 2008 开启被遗忘的 “同步类视图”功能、附带一个MSDN 的 bug 实战 IE8 开发人员工具 在真实项目中使用第三方或开源代的代码,组件,中间件,框架的基本规则 你有?项目设计开发阶段,甲方经常的要求看程序,而经常在做【假界面】【假程序】的情况吗? Windows Live Writer 测试 文档共享:罗斯文2007 (Northwind 2007),数据库文件,中文版本、英文版、英文表结构中文数据版 本机 MSDN Sorry, no topics were found for the selected link 问题,及临时解决方案 2008-9-6 文档共享:罗斯文2007 (Northwind 2007),数据库,微软最新的 Access 2007 样列数据库分析(中文/英文) C# 操作 XML 数据库类型、Oracle XMLType IE7,ie8说爱你不容易,企业应用困局 如何:在 Winform 动态启动、控制台命令行? 如何:使 comboBox 输入状态变成 readonly 方式;TextBox 只读时的效果; 设计模式学习:Model View Presenter (MVP) C# 直接执行、调用本机代码、汇编代码 shell Native Code OneDay “屏幕任务”小软件 TaskScreen_080408 Oracle 使用数据泵 expdp impdp 导入导出数据库“表空间”文件 适合编程开发用的"宋体"和"新宋体"
windows 桌面开发 - 子类化控件(不用任何WinAPI),演示拦截Button的WM_LBUTTONDBLCLK
曲滨*銘龘鶽 · 2008-10-18 · via 博客园 - 曲滨*銘龘鶽

最近在博客里看见,有位朋友在研究如何实现 button 的双击
网址: http://www.cnblogs.com/adaiye/archive/2008/10/16/button_doubleclick2.html

    他是用代码实现的其实他的精神是值得学习的,不过在按钮上加双击事件事情本身是比较囧的呵呵、我看过了了这篇文章后感慨万分,看来很多窗口开发相关的技能(所谓技能就是组成某种技术的最小单元,技术是指如何运用技能)可能园子里很多朋友还不是很熟悉(没有卖弄的意思啊),特此化几分钟时间写了点代码贴在这里,供大家学习参考、windows 开发老鸟可以直接无视这篇文章;

    其实本代码段最主要是以一种外挂的方式,拦截窗口上的控件事件(windows 消息)前提是控件本身并没有实现,比如代码中的 WM_LBUTTONDBLCLK 消息 button 并没有提供相应的事件封装 (按钮双击没有意义,请不要模仿),主要为了解决一些代码比较少的操作,如果是比较多的代码最好封装成控件,便于重用;

    多年不进行 windows 桌面开发了很多地方可能写的有些问题,请见谅,代码很简单我就不过多注释了;

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;namespace WindowsApplication1
{
    
public partial class Form1 : Form
    {
        
//窗口上就一个按钮 Form1.Designer.cs 就不贴了//这个类在代码后边有说明
        SubClassManager scm;
        
public Form1()
        {
            InitializeComponent();
            
//1) 子类化控件并映射处理函数
            scm = new SubClassManager(this.button1.Handle); 
            scm.SubClassWindowProc 
+= button1_WndProc; //事件映射
        }protected override void OnHandleDestroyed(EventArgs e)
        {
            
//3) 释放
            scm.Dispose();
            
base.OnHandleDestroyed(e);
        }
                
        
        
protected bool button1_WndProc(ref Message m)
        {
            
//2)这里可以接到 button1 的任何消息
            
            
//按钮双击, .net 没有封装这个事件,这里只是为了演示子类话
            
//按钮双击没有意义,请不要模仿
            const int WM_LBUTTONDBLCLK = 0x0203;
            
            
if (m.Msg == WM_LBUTTONDBLCLK)
            {
                Console.WriteLine(
"WM_LBUTTONDBLCLK"); //填写你的处理代码
            }        
            
            
return true;
        }

        
    }

/// <summary>
    
/// 本类用于子类化控件或窗口,拦截一些.net 没有封装的消息(窗口重写 WndProc 即可不要使用本类)
    
/// </summary>
    public class SubClassManager : System.Windows.Forms.NativeWindow,IDisposable
    {
        
public delegate bool SubClassWndProc(ref Message m); //消息处理函数委托
        
        
private IntPtr handle;        
        
private bool disposed = false;public event SubClassWndProc SubClassWindowProc; //消息处理事件
        
        
public SubClassManager(IntPtr hWnd)
        {
            handle 
= hWnd;
            
this.AssignHandle(handle);            
        }
protected override void WndProc(ref Message m)
        {
            
if (SubClassWindowProc != null)
            {
                
if(SubClassWindowProc(ref m))
                {
// 如果返回 true 调用基础类
                    base.WndProc(ref m);
                }
            }            
        }
#region IDisposable 成员
        
~SubClassManager()
        {
            Console.WriteLine(
"请释放 SubClassManager");
            Dispose(
false);
        }
        
private void Dispose(bool disposing)
        {
        
            
if (!this.disposed)
            {
                
if (disposing)
                {
                    
this.ReleaseHandle();
                }                
                
            }
            disposed 
= true;
        }
public void Dispose()
        {
            Dispose(
true);
        }
#endregion
    }
}