前两日,偶见博客“创建类似于输入法窗口的非激活窗口”,觉得内容不错,决定试了试,发现有瑕疵,现将自己的测试过程赋予其后(本文测试用的是VS2005),和各位网友交流。

  按照那篇的博文的第一种方法,新建了Form1,改写了Form1的CreateParams属性,将FormBorderStyle设置为 System.Windows.Forms.FormBorderStyle.None。

  1.   Protected Overrides ReadOnly Property CreateParams() As CreateParams
  2.     Get
  3.       Dim tC As CreateParams = MyBase.CreateParams
  4.       tC.ExStyle = tC.ExStyle Or &H8000000
  5.       Return tC
  6.     End Get
  7.   End Property

复制代码

测试了一下,不错,和打开的“记事本”做了比较,当我单击Form1的时候,光标还在“记事本”里。

  于是,又新建Form2,并改为启动窗口,上面添加了Textbox1控件,在该控件的双击事件,启动Form1

  1.   Private Sub TextBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.DoubleClick
  2.     Form1.Show()
  3.   End Sub

复制代码

按照设想,双击文本框的时候,弹出Form1,光标仍然在文本框内。

  不成想,光标不见了,文本框失去焦点,焦点在Form1上(后来将Form1的FormBorderStyle设置为 System.Windows.Forms.FormBorderStyle.FixedToolWindow后证实了这一点。焦点的确移到Form1 上)

  后来想想,在启动Form1后,强制将焦点切回来后能不能好一点呢,于是,将上面的代码改为

  1.   Private Sub TextBox1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.DoubleClick
  2.     Form1.Show()
  3.     Me.Activate()
  4.   End Sub

复制代码

启动Form1后,光标的确在文本框,但单击Form1后,光标又没了,焦点在Form1上。“杯具”呀。

  如此努力了若干次,均没有效果,貌似单个程序里有两个Form(或者超过两个),这个效果就出不来。

  后来查了查&H8000000代表的含义是WS_DISABLED,也没整明白是什么意思。

    后来在网上查找到一篇文章,通篇的英文,没有细看,将里面的代码测试了一下,能成功。网址如下:On-screen Keyboards,相关代码如下:

  1. private const int
  2. WS_EX_NOACTIVATE = 0x08000000;
  3. protected override CreateParams CreateParams
  4. {
  5. get
  6. {
  7. CreateParams createParams =
  8. base.CreateParams;
  9. createParams.ExStyle = createParams.ExStyle & WS_EX_NOACTIVATE;
  10. return createParams;
  11. }
  12. }
  13. Finally, you need to prevent the form getting focus or being activated
  14. when it or the keyboard control are clicked on. This is as easy as
  15. adding the following code to the host form;
  16. private const int WM_MOUSEACTIVATE
  17. = 0x0021;
  18. private const int MA_NOACTIVATE
  19. = 0x0003;
  20. protected override void WndProc(ref Message m)
  21. {
  22. //If we're being activated because
  23. the mouse clicked on us...
  24. if (m.Msg == WM_MOUSEACTIVATE)
  25. {
  26. //Then refuse to be activated, but
  27. allow the click event to pass through (don't use MA_NOACTIVATEEAT)
  28. m.Result = (IntPtr)MA_NOACTIVATE;
  29. }
  30. else
  31. base.WndProc(ref m);
  32. }

复制代码

他的代码中,添加了一段修改Form的WndProc代码,拦截WM_MOUSEACTIVATE消息,改为MA_NOACTIVATE。

  代码如下:

  1.   Private Const WM_MOUSEACTIVATE As Integer = &H21
  2.   Private Const MA_NOACTIVATE As Integer = &H3
  3.   Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
  4.     If m.Msg = WM_MOUSEACTIVATE Then
  5.       m.Result = MA_NOACTIVATE
  6.     Else
  7.       MyBase.WndProc(m)
  8.     End If
  9.   End Sub

复制代码

经测试,终于达到了效果,启动Form1,光标在文本框内,无论怎么点击Form1,光标都不曾发生变化。

  上面这段的代是有效的,甚至去掉一开始的改写CreateParams的代码,仍然有效。

  再做了若干测试,发现上面的代码效果,如果要成功,还必不可少的是Form上没有能接受焦点的控件(Button,TextBox等),而且还不能有标题栏。解决的办法,就是去掉Form的标题栏,不使用能接受焦点的控件(或者是改写控件的WndProc过程,拦截接受焦点的消息,使之不能接受焦点)。虽然Form不能接受焦点,但是经过测试,控件还是能接受其他的事件(例如:Click,DoubleClick,MouseHover,MouseLeave 等事件),合理运用的话,还是能产生不错的效果。(文/万仓一黍)

上文中提到假如窗体上有可以获得焦点的Control时,改写控件的WndProc过程,拦截接受焦点的消息,使之不能接受焦点,

补充代码如下:

[DllImport("user32.dll")]
        private extern static IntPtr SetActiveWindow(IntPtr handle);
        private const int WM_ACTIVATE = 0x006;
        private const int WM_ACTIVATEAPP = 0x01C;
        private const int WM_NCACTIVATE = 0x086;
        private const int WA_INACTIVE = 0;
        private const int WM_MOUSEACTIVATE = 0x21;
        private const int MA_NOACTIVATE = 3;

protected override void WndProc(ref Message m)
        {
            if (m.Msg == WM_MOUSEACTIVATE)
            {
                m.Result = new IntPtr(MA_NOACTIVATE);
                return;
            }
            else if (m.Msg == WM_NCACTIVATE)
            {
                if (((int)m.WParam & 0xFFFF) != WA_INACTIVE)
                {
                    if (m.LParam != IntPtr.Zero)
                    {
                        SetActiveWindow(m.LParam);
                    }
                    else
                    {
                        SetActiveWindow(IntPtr.Zero);
                    }
                }
            }
            base.WndProc(ref m);
        }
这样即使窗体上有可获得焦点的Control,键盘也不会抢占焦点了~

要下载例程请点这里

创建类似于输入法窗口的非激活窗口相关推荐

  1. 再议“创建类似于输入法窗口的非激活窗口”

    前两日,偶见博客"创建类似于输入法窗口的非激活窗口",觉得内容不错,决定试了试,发现有瑕疵,现将自己的测试过程赋予其后(本文测试用的是VB2005),和各位网友交流. 按照那篇的博 ...

  2. 创建类似于输入法窗口的非激活窗口--续

    前两日,偶见博客"创建类似于输入法窗口的非激活窗口",觉得内容不错,决定试了试,发现有瑕疵,现将自己的测试过程赋予其后(本文测试用的是VB2005),和各位网友交流. 按照那篇的博 ...

  3. swing退出子窗口事件_如何创建有效的退出弹出窗口?

    如何创建有效的退出弹出窗口? 下面的退出弹出窗口为电子邮件列表增加了4153个订阅者: 这个提供折扣的弹出窗口,帮助Storiarts在60天之内挽回了96个弃单客户,从而额外创造了5000美元的销售 ...

  4. python窗口图形界面编程上传图片_python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例...

    注意主窗口一定要为tk.Tk(),在主窗口上通过button的点击相应子函数创建子窗口,注意此时创建出来的窗口必须是Toplevel,否则出错. 至于用图片在窗口上绘图,则按代码所示即可. # -*- ...

  5. pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮2输出消息、按钮3可退出

    pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮三可退出 目标:设计一个含有三个按钮的窗口,点击按钮2弹出消息,点击按钮3退出 如果是使用的anacoda那么自带qtde ...

  6. 非激活窗口(Inactive Window)

    非激活窗口(Inactive Window)

  7. 【Unity3D】Unity 编辑器窗口布局 ( 创建 Unity3D 项目 | 添加物体 | 层级窗口 | 场景窗口 | 游戏窗口 | 属性窗口 | 项目窗口 | 控制台窗口 | 窗口位置修改 )

    文章目录 一.在 Unity Hub 中创建 Unity 2020 编辑器版本的 Unity3D 项目 二.Unity 编辑器窗口布局 1.添加物体 2.菜单栏和工具栏 3.Hierarchy 层级窗 ...

  8. CreateWindow创建异形窗口(不规则窗口) - WINDOWS API 第三弹 异形窗口。

    本期将自己从底层中抽离出来,来搞点UI设计相关的,毕竟UI是本人强项(矮子里面拔高个吧).你的UI界面是不是都是矩形框,你有想过其他形状的界面吗?是不是感觉计算机应用就应该是方方正正的.答案肯定是NO ...

  9. 创建一个简单的应用程序窗口,显示“欲穷千里目 更上一层楼”。这一行文字从窗口中向左滚动显示,而且每显示一轮,改变一次颜色,改变一次字体,一个周期为4种颜色,分别为红、绿、黄、蓝,四种字体分别为宋体、楷

    创建一个简单的应用程序窗口,显示"欲穷千里目 更上一层楼".这一行文字从窗口中向左滚动显示,而且每显示一轮,改变一次颜色,改变一次字体,一个周期为4种颜色,分别为红.绿.黄.蓝,四 ...

最新文章

  1. Facebook恐打破最长月度连跌记录,黄金时代宣告结束!
  2. WIN10系统如何取消任务栏处的窗口缩略图
  3. CPU占用率是什么?
  4. mac golang无法启动_Mac无法开机?如何修复并使其重新启动
  5. html真实雾效果图,HTML5 Canvas图片上云雾弥漫驱散特效
  6. Leetcode每日一题:46.permutations(全排列)
  7. 目标检测——评价指标的学习笔记
  8. 中孚计算机保密 卸载,智华计算机终端保密检查系统怎样卸载
  9. 局域网中的通信协议及选择简述。
  10. imperva数据库脱敏-server2008
  11. 擦黑板特效表白H5源码+非常浪漫/附BGM
  12. 【R语言】敏感度、特异度、准确率检验及置信区间求解
  13. 我的团长我的团第二十七集
  14. win10 无法查看工作组计算机名,win10系统无法查看工作组计算机的技巧
  15. java 游戏打砖块_基于JAVA的打砖块游戏
  16. 读应届生论坛的“职业生涯步步高:一位资深经理人的职业生涯感悟”之一
  17. python程序员买西瓜代码_朴素贝叶斯python代码实现(西瓜书)
  18. 网易严选如何打造数仓规范和评价体系
  19. cv2.warpAffine( )
  20. php如何访问web api,如何在PHP中创建Web API服务?

热门文章

  1. 电磁流量计电极和电磁的清洁
  2. 手机联系人头像包_苹果液态硅胶手机壳,官网同品质新颜色全型号!!
  3. 狭道相逢勇者胜--记IT维护中心足球赛
  4. 怎样备份计算机注册表文件格式,Windows7如何备份注册表,经验告诉你该这样
  5. 阿里云X-Forwarded-For 发现tomcat记录的日志全部来自于SLB转发的IP地址,不能获取到请求的真实IP。
  6. 公司代理上网环境下gem和cocoapods 使用教程
  7. 如何确定选择的业务组织有没有该权限的主业务类型
  8. 中科昊芯DSP_RISC-V笔记(4)_PWM事件触发
  9. 【论文理解】Few-Shot Lifelong Learning
  10. 我的世界服务器修改钟,我的世界钟合成表 钟使用方法详解