创建类似于输入法窗口的非激活窗口
按照那篇的博文的第一种方法,新建了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,也没整明白是什么意思。
后来在网上查找到一篇文章,通篇的英文,没有细看,将里面的代码测试了一下,能成功。网址如下:On-screen Keyboards,相关代码如下:
- private const int
- WS_EX_NOACTIVATE = 0x08000000;
- protected override CreateParams CreateParams
- {
- get
- {
- CreateParams createParams =
- base.CreateParams;
- createParams.ExStyle = createParams.ExStyle & WS_EX_NOACTIVATE;
- return createParams;
- }
- }
- Finally, you need to prevent the form getting focus or being activated
- when it or the keyboard control are clicked on. This is as easy as
- adding the following code to the host form;
- private const int WM_MOUSEACTIVATE
- = 0x0021;
- private const int MA_NOACTIVATE
- = 0x0003;
- protected override void WndProc(ref Message m)
- {
- //If we're being activated because
- the mouse clicked on us...
- if (m.Msg == WM_MOUSEACTIVATE)
- {
- //Then refuse to be activated, but
- allow the click event to pass through (don't use MA_NOACTIVATEEAT)
- m.Result = (IntPtr)MA_NOACTIVATE;
- }
- else
- base.WndProc(ref m);
- }
复制代码
他的代码中,添加了一段修改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 等事件),合理运用的话,还是能产生不错的效果。(文/万仓一黍)
上文中提到假如窗体上有可以获得焦点的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,键盘也不会抢占焦点了~
要下载例程请点这里
创建类似于输入法窗口的非激活窗口相关推荐
- 再议“创建类似于输入法窗口的非激活窗口”
前两日,偶见博客"创建类似于输入法窗口的非激活窗口",觉得内容不错,决定试了试,发现有瑕疵,现将自己的测试过程赋予其后(本文测试用的是VB2005),和各位网友交流. 按照那篇的博 ...
- 创建类似于输入法窗口的非激活窗口--续
前两日,偶见博客"创建类似于输入法窗口的非激活窗口",觉得内容不错,决定试了试,发现有瑕疵,现将自己的测试过程赋予其后(本文测试用的是VB2005),和各位网友交流. 按照那篇的博 ...
- swing退出子窗口事件_如何创建有效的退出弹出窗口?
如何创建有效的退出弹出窗口? 下面的退出弹出窗口为电子邮件列表增加了4153个订阅者: 这个提供折扣的弹出窗口,帮助Storiarts在60天之内挽回了96个弃单客户,从而额外创造了5000美元的销售 ...
- python窗口图形界面编程上传图片_python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例...
注意主窗口一定要为tk.Tk(),在主窗口上通过button的点击相应子函数创建子窗口,注意此时创建出来的窗口必须是Toplevel,否则出错. 至于用图片在窗口上绘图,则按代码所示即可. # -*- ...
- pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮2输出消息、按钮3可退出
pyqt5+qt desiger实例教程(1)创建含有三个按钮的窗口,点击按钮三可退出 目标:设计一个含有三个按钮的窗口,点击按钮2弹出消息,点击按钮3退出 如果是使用的anacoda那么自带qtde ...
- 非激活窗口(Inactive Window)
非激活窗口(Inactive Window)
- 【Unity3D】Unity 编辑器窗口布局 ( 创建 Unity3D 项目 | 添加物体 | 层级窗口 | 场景窗口 | 游戏窗口 | 属性窗口 | 项目窗口 | 控制台窗口 | 窗口位置修改 )
文章目录 一.在 Unity Hub 中创建 Unity 2020 编辑器版本的 Unity3D 项目 二.Unity 编辑器窗口布局 1.添加物体 2.菜单栏和工具栏 3.Hierarchy 层级窗 ...
- CreateWindow创建异形窗口(不规则窗口) - WINDOWS API 第三弹 异形窗口。
本期将自己从底层中抽离出来,来搞点UI设计相关的,毕竟UI是本人强项(矮子里面拔高个吧).你的UI界面是不是都是矩形框,你有想过其他形状的界面吗?是不是感觉计算机应用就应该是方方正正的.答案肯定是NO ...
- 创建一个简单的应用程序窗口,显示“欲穷千里目 更上一层楼”。这一行文字从窗口中向左滚动显示,而且每显示一轮,改变一次颜色,改变一次字体,一个周期为4种颜色,分别为红、绿、黄、蓝,四种字体分别为宋体、楷
创建一个简单的应用程序窗口,显示"欲穷千里目 更上一层楼".这一行文字从窗口中向左滚动显示,而且每显示一轮,改变一次颜色,改变一次字体,一个周期为4种颜色,分别为红.绿.黄.蓝,四 ...
最新文章
- Facebook恐打破最长月度连跌记录,黄金时代宣告结束!
- WIN10系统如何取消任务栏处的窗口缩略图
- CPU占用率是什么?
- mac golang无法启动_Mac无法开机?如何修复并使其重新启动
- html真实雾效果图,HTML5 Canvas图片上云雾弥漫驱散特效
- Leetcode每日一题:46.permutations(全排列)
- 目标检测——评价指标的学习笔记
- 中孚计算机保密 卸载,智华计算机终端保密检查系统怎样卸载
- 局域网中的通信协议及选择简述。
- imperva数据库脱敏-server2008
- 擦黑板特效表白H5源码+非常浪漫/附BGM
- 【R语言】敏感度、特异度、准确率检验及置信区间求解
- 我的团长我的团第二十七集
- win10 无法查看工作组计算机名,win10系统无法查看工作组计算机的技巧
- java 游戏打砖块_基于JAVA的打砖块游戏
- 读应届生论坛的“职业生涯步步高:一位资深经理人的职业生涯感悟”之一
- python程序员买西瓜代码_朴素贝叶斯python代码实现(西瓜书)
- 网易严选如何打造数仓规范和评价体系
- cv2.warpAffine( )
- php如何访问web api,如何在PHP中创建Web API服务?
热门文章
- 电磁流量计电极和电磁的清洁
- 手机联系人头像包_苹果液态硅胶手机壳,官网同品质新颜色全型号!!
- 狭道相逢勇者胜--记IT维护中心足球赛
- 怎样备份计算机注册表文件格式,Windows7如何备份注册表,经验告诉你该这样
- 阿里云X-Forwarded-For 发现tomcat记录的日志全部来自于SLB转发的IP地址,不能获取到请求的真实IP。
- 公司代理上网环境下gem和cocoapods 使用教程
- 如何确定选择的业务组织有没有该权限的主业务类型
- 中科昊芯DSP_RISC-V笔记(4)_PWM事件触发
- 【论文理解】Few-Shot Lifelong Learning
- 我的世界服务器修改钟,我的世界钟合成表 钟使用方法详解