再议“创建类似于输入法窗口的非激活窗口”-阿里云开发者社区

开发者社区> 橘子红了呐> 正文

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

简介:
+关注继续查看

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

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

  Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim tC As CreateParams = MyBase.CreateParams

      tC.ExStyle = tC.ExStyle Or &H8000000

      Return tC

    End Get

  End Property

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

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

  Private Sub TextBox1_DoubleClick(ByVal sender As ObjectByVal e As System.EventArgs) Handles TextBox1.DoubleClick

    Form1.Show()
End Sub

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

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

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

  Private Sub TextBox1_DoubleClick(ByVal sender As ObjectByVal e As System.EventArgs) Handles TextBox1.DoubleClick

    Form1.Show()

    Me.Activate()
End Sub

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

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

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

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

  http://www.yortondotnet.com/2006/11/on-screen-keyboards.html

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

  代码如下:

  Private Const WM_MOUSEACTIVATE As Integer = &H21

  Private Const MA_NOACTIVATE As Integer = &H3

 

  Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
If m.Msg = WM_MOUSEACTIVATE Then
m.Result = MA_NOACTIVATE
Else

      MyBase.WndProc(m)

    End If

  End Sub

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

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

 

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


  本文转自万仓一黍博客园博客,原文链接:http://www.cnblogs.com/grenet/archive/2010/03/13/1685196.html,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9489 0
SQL中创建用户的方法
1.在windows用户下创建登陆账号和密码。        1.1 create login login_name with password='  ';        1.2 创建好登录名后可以再服务器的安全性中查看是否出现你所创建的用户.                      1.3 创建好登录名后可以再windows用户上右击鼠标并在安全性中设置双用户模式.               1.3.1   1.3.2      2.启动数据库后可以用已经创建好的登录名和密码进行登录.   3.在windows用户下创建数据库用户。
483 0
SQLite3创建数据库的方法
上次刚接触SqlLite,不知道怎么创建数据库,现在做下总结:   界面和MYSQL一样,都是CMD界面,但不是在SQLite.exe中创建数据库: 首先还是说一下cmd下sqlite的使用网上已经很多了、不做过多的赘述。
858 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13168 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
11502 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
6887 0
3404
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载