快捷搜索:

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

前两日,偶见博客“创建类似于输入法窗口的非激活窗口”,感觉内容不错,抉择试了试,发明有瑕疵,现将自己的测试历程付与其后(本文测试用的是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等事故),合理运用的话,照样能孕育发生不错的效果。

您可能还会对下面的文章感兴趣: