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

  前两日,偶见博客“创建类似于输入法窗口的非激活窗口”,觉得内容不错,决定试了试,发现有瑕疵,现将自己的测试过程赋予其后(本文测试用的是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 Object, ByVal 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 Object, ByVal 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等事件),合理运用的话,还是能产生不错的效果。

 

时间: 2024-09-12 23:48:28

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

对象-我用编码方式在qt创建一个窗口,为什么除了窗口的标题显示正常外,其余地方窗口都没有显示?

问题描述 我用编码方式在qt创建一个窗口,为什么除了窗口的标题显示正常外,其余地方窗口都没有显示? 我用编码方式在qt创建一个窗口,为什么除了窗口的标题显示正常外,其余地方窗口都没有显示?求指教! 代码:#ifndef CALENDER_H #define CALENDER_H #include #include #include #include #include #include #include #include #include #include #include #include #i

如何创建一个JavaScript弹出DIV窗口层的效果_javascript技巧

在本教程中,我将用最通俗的语言和最简洁的代码给大家演示如何创建一个JavaScript弹出DIV窗口层的效果. 创建一个弹出DIV窗口可能是现在网站/网页制作中最常碰到的问题之一.传统的JavaScript弹窗已经不适合目前网站的设计理念了,理由有二:首先,不友好--生硬的弹出对话框且伴随着"哐"的一声对用户体验是个很大的挑战:其次,兼容性不够强--有相当多的浏览器屏蔽了这种JS的Alert()方法.于是,一个良好用户体验的网站需要一种更合理的解决方案--使用很少的HTML代码,很少的

再议高校教室监控 隐私与安全之间如何权衡

2016年10月,一则中山大学拟在教室安装监控摄像头的消息曾引起一番热议.起因是中山大学印发了一份<中山大学关于全面深化本科教育教学改革提高人才培养质量的若干意见>,其中提出,拟"对教学实施全过程监控".这一<意见>引起该校学生的担忧,质疑监控教学会泄露和侵犯隐私.事后社会各方对此事件发表了各种意见,总的来说,大家还是支持监控教学的,只是希望在监控教学的管理上能有更完善的管理以减少大家对隐私泄露的担忧. 再议高校教室监控 隐私与安全之间如何权衡 为什么会今天再议

Windows 8.1 应用再出发 - 创建我的第一个应用

原文:Windows 8.1 应用再出发 - 创建我的第一个应用 转眼间Windows 8.1已经发布了四个多月,之前因为开发需要对Windows 8.1新特性进行过零散的学习和使用,一直没有静下心来系统的学习过.近日部门有几名新同事加入,需要进行Windows 商店应用开发的培训,所以借这个机会,重新梳理一下Windows 8.1 应用开发的知识.闲言碎语不多讲,接下来开始第一站,创建第一个应用. 首先我们看一下开发环境要求:Windows 8.1 + Visual Studio 2013 紧

MFC子窗口和父窗口(SetParent,SetOwner)

一.概念和区别 在windows系统中,每个窗口对象都对应有一个数据结构,形成一个list链表.系统的窗口管理器通过这个list来获取窗口信息和管理每个窗口.这个数据结构中有四个数据用来构建list,即child.sibling.parent.owner四个域.所以我们可以看到,窗口之间的关系有两种:owner-owned 关系和 parent-child关系.前者称之为拥有/被拥有关系,后者称之为父/子关系.在这篇文字中,我把owner窗口称之所有者窗口.换句话说,一个窗口在有一个父窗口(pa

子窗口、父窗口和Silverlight之间的相互调用_javascript技巧

其实,他们之间的调用还是很简单的~ 基础篇 一.父页面调用子页面中的JS 我们先创建一个子窗体 复制代码 代码如下: var win $(function () { Root = $('#Root').val();//设置根目录 }); function OpenPlayer(id, type, add) { //这里是用来限制同一个窗口只能弹出一次的 //其实就算不做限制,只要window.open参数中的name相同,就不会重复打开 //window.open中的参数可以参考别的文章,有很多

jQuery父窗口与子窗口通信

$("#父窗口元素ID",window.parent.document);  对应javascript版本为window.parent.document.getElementByIdx_x("父窗口元素ID"): 取父窗口的元素方法:$(selector, window.parent.document); 那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document); 类似的,取其它窗口的方法大同小异 $

JavaScript实际应用:子窗口和父窗口交互

javascript|父窗口|交互|子窗口 最近项目开发中需要子窗口和父窗口交互的内容,基本上无非就是把子窗口的信息传递给父窗口,并且关闭自己等等,或者是父窗口把自己的信息传递给子窗口等等. 1.父窗口传递信息给子窗口 看代码实例:<script language=javascript> function outPut(){ //获取父窗口的文本信息赋值给text var text = document.abc.text.value; //打开子窗口,并且把操作句柄赋值给win变量,以下所有操

蓝软7000ERP表格窗口及树形窗口操作说明

表格窗口及其操作 该类窗口显示了某类基础资料的主要信息,窗口下方一般会提供[操作].[打印]下拉按钮,单击[操作].[打印]系统会弹出一个浮动菜单,从中选择相应功能,然后就可以进行基础资料的基本操作了,以下以"客户资料"为例. 1. 单击[新增]或者按下快捷键(N):系统打开一个基础资料的编辑窗口,在空白编辑框中录入或单击下拉按钮从列表中选择相应的数据即可. 2. 单击[修改]或者按下快捷键(E):系统打开修改资料的编辑窗口,并且把当前选定的资料送入编辑窗口.修改其中可修改的部分即可.