今天晚上发飚了,来一段“浮动”窗口的代码

前一段时间看到 博客堂上面的 mvm用纯.NET写了一个有趣的程序,用来记录 敲击键盘次数,当时就非常感兴趣。不过可惜这边的破烂蓝波速度质量奇差,当时网络时断时续无法下载,后来有机会 下载了,却连接失效了。所以一直就没有机会看看原程序,家伙都准备好了——Refactor,既然mvm都说了可以disassemble……可惜啊可惜,后来就一直没有关注了。

今天晚上发飚,突然想起来 mvm说我介绍的 这个代码着色器有问题, 说不能够正确处理空格,今天我突然想到原来是博客堂那边的.TEXT有点问题,如果拷贝上去的内容有空格,是不会自动转换成  的,同时也不接受空格,会出错,于是就让mvm以为是语法着色器的问题。于是我就想找mvm的那个Post,re他让他来博客源申请一个号,这样就可以用博客源的编辑器来编辑,编辑好了再转贴到博客堂就不会出问题了。

没想到那篇文章还没有找到,却又重新注意上那篇键盘计数器的Post,发现有40多个Reply,于是进去看看有什么新鲜说法。结果发现有人问 floating窗口怎么做,嘿嘿,不就是floating嘛,拿手好戏……于是干脆忘了原来的想法,改变目标,把我的方法贡献出来给大家:

         private   const   int  WM_NCHITTEST  =   0x0084 ;
        
private   readonly  IntPtr HT_CAPTION  =   new  IntPtr( 2 );
        
protected   override   void  WndProc( ref  Message m)
        
{
            
if (m.Msg == WM_NCHITTEST)
            
{
                m.Result 
= HT_CAPTION;
            }

            
else
            
{
                
base.WndProc(ref m);
            }

        }


是不是很简单呢?呵呵,实际上在WinUser.h里面还有好多关于HITTEST的返回值的定义,如果有兴趣的话可以做一个不规则的窗口出来,其实还是相当容易的。至少在要求整个窗口任何部分点击之后都能够移动窗口,代码就比 mvm提供的方法要“简单”多了。(呵呵,mvm的方法其实也挺简单的,至少不需要知道什么消息机制、消息代码等比较啰嗦的东西,以前VB3的时候我就是这么干的。)当然这里涉及了一些CLR以外的知识,可以说并不是非常纯正的CLR解决方案。不过这里也没有使用到任何.NET Framework以外的东西,甚至没有P/Invoke,所以还是相当pure的。有兴趣的话还可以试一下值为-1的Transparent,为0的NoWhere,为3的SysMenu,为20的Close等等,写出来的窗口绝对有着“莫名其妙”的行为,好玩着呢。(不怕死的还可以试一下-2 —— Error,我怕,没试过)

P.S.: WinUser.h可以在你的Vs.net安装目录下面的VC7\PlatformSDK\Include里面找到,如果你的VC安装全了的话。比如说:
C:\Program Files\Microsoft Visual Studio 2003\Vc7\PlatformSDK\Include\WinUser.h

P.S.S.: 今天晚上继续发飚,也许还会有第5、第6篇文章……好戏不是天天有,但今天连台。

你可能感兴趣的:(代码)