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

  按照那篇的博文的第一种方法,新建了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 等事件),合理运用的话,还是能产生不错的效果

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

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

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

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

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

  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. 美国科学院报告《无止境的前沿:科学的未来75年》
  2. 移动互联网时代 浏览器不可能干掉App
  3. Web App 和 Native App,哪个是趋势?
  4. 他一口气写出了这7k字的红黑树总结!看过的都说好!!|文末送书
  5. Android doc|Getting Started|部分 --转载 保存数据
  6. 陈大惠老师:什么叫道德?
  7. 更改Oracle数据库的编码格式,解决导入时ORA-12899错误
  8. 韩国被申遗 (转自果壳)
  9. 421.数组中两个数的最大异或值
  10. 凌波多媒体教室软件_看胖瘦终端,如何让教室变得更“智慧”
  11. Modscan32使用注意事项
  12. 合数阶群与素数阶群的双线性映射
  13. 数据仓库与数据挖掘课后思考题整理
  14. 雷赛acc68c说明书_深圳雷赛科技有限公司官网 雷赛智能公司怎么样 雷赛运动控制卡教程 雷赛步进电机说明书 雷赛m542c说明书 雷赛智能官网...
  15. 小项目1——猫眼Top100 爬取
  16. Ddos攻击怎么防护?DDOS八大防御策略
  17. 机器学习模型评价指标(准确率、精度、召回率)
  18. android 环信使用方法,Android 环信的使用
  19. alert angularjs
  20. vba 发送邮件 html,VBA自动发送邮件+内容+附件

热门文章

  1. 每日一题,让你的代码也高大上起来
  2. 华中科技大学SPOC编程题第六章
  3. java面试2018版
  4. [分享]二代居民身份证照片(wlt)解码动态链接库(无需许可证文件)
  5. 完数,恰好等于它的因子之和
  6. 机会只给有准备的人_20120430
  7. python小项目--》烤牛排
  8. Java窗口游戏开发,飞机大战,打飞机,打大飞机,打无敌飞机妙啊!!!!————————香啊~~~~~~~~~~~~~~~~~
  9. 高效率、高精度LED恒流驱动方案
  10. 回归程序世界,努力做出成绩