unity3d屏蔽Windows10输入法
在win10上,如果安装了某些输入法(比如QQ输入法),会造成unity的键盘事件被输入法捕获而不能触发的情况。只有将输入法切换到英文状态下才能响应键盘事件。
解决办法有,
1:用户主动切换输入法,甚至卸载输入法
2:程序在非输入状态下,屏蔽输入法
由于方法1在全屏状态下,用户完全不知道是否在输入法劫持中,常常导致以为是程序的bug,所以这里采用方法2
在unity中,官方并没有提供一个很好的解决方案(Input.imeCompositionMode无效)。所以只能借助win api。
其中最为重要的API是设置输入法状态:
[DllImport("imm32.dll")]
private static extern bool ImmSetOpenStatus(IntPtr himc, bool b);
其中himc为当前正在输入的窗口的输入法句柄,b为true表示开启,false表示关闭
himc可以通过另外一个api函数获取
[DllImport("imm32.dll")]
private static extern IntPtr ImmGetContext(IntPtr hwnd);
其中,hwnd为程序窗口的句柄
该值的获取方式可以参考:http://blog.csdn.net/linkrules/article/details/50420797
整个代码如下:
using System;
using System.Diagnostics;
using System.Runtime.InteropServices; public class Win32Help
{
private delegate bool Wndenumproc(IntPtr hwnd, uint lParam); [DllImport("user32.dll", SetLastError = true)]
private static extern bool EnumWindows(Wndenumproc lpEnumFunc, uint lParam); [DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr GetParent(IntPtr hWnd);
[DllImport("user32.dll")]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, ref uint lpdwProcessId); [DllImport("kernel32.dll")]
private static extern void SetLastError(uint dwErrCode); /// <summary>
/// 获取当前进程的窗口句柄
/// </summary>
/// <returns></returns>
public static IntPtr GetProcessWnd()
{
var ptrWnd = IntPtr.Zero;
var pid = (uint)Process.GetCurrentProcess().Id; // 当前进程 ID var bResult = EnumWindows(delegate (IntPtr hwnd, uint lParam)
{
uint id = ; if (GetParent(hwnd) != IntPtr.Zero)
return true;
GetWindowThreadProcessId(hwnd, ref id);
if (id != lParam)
return true;
ptrWnd = hwnd; // 把句柄缓存起来
SetLastError(); // 设置无错误
return false; // 返回 false 以终止枚举窗口
}, pid); return (!bResult && Marshal.GetLastWin32Error() == ) ? ptrWnd : IntPtr.Zero;
} [DllImport("imm32.dll")]
private static extern IntPtr ImmGetContext(IntPtr hwnd);
[DllImport("imm32.dll")]
private static extern bool ImmGetOpenStatus(IntPtr himc);
[DllImport("imm32.dll")]
private static extern bool ImmSetOpenStatus(IntPtr himc, bool b); /// <summary>
/// 设置输入法状态
/// </summary>
/// <param name="tf"></param>
public static void SetImeEnable(bool tf)
{
var handle = GetProcessWnd();
var hIme = ImmGetContext(handle);
ImmSetOpenStatus(hIme, tf);
} /// <summary>
/// 获取输入法状态
/// </summary>
/// <returns></returns>
public bool GetImeStatus()
{
var handle = GetProcessWnd();
var hIme = ImmGetContext(handle);
return ImmGetOpenStatus(hIme);
}
}
然后在程序中可以使用Win32Help.SetImeEnable(false)的方法来屏蔽输入法,比如:
using UnityEngine;
public class InputTest : MonoBehaviour
{
// Use this for initialization
protected void Start()
{
Win32Help.SetImeEnable(false);
} // Update is called once per frame
protected void Update()
{
if (Input.GetKey(KeyCode.A))
{
Debug.Log("AAAAAAAAAAAs");
}
}
}
注意:只对Windows系统有效,Win10测试可用,其他系统未经测试
unity3d屏蔽Windows10输入法的更多相关文章
- JS对输入判断变化屏蔽中文输入法输入时连续触发事件的方法
代码如下: //智能搜索提示 IntelligenceSearch: function IntelligenceSearch() { $('#keyWord').on('input', functio ...
- Windows10输入法的切换
Alt+Shift 中⇒あ,あ⇒中 Shift 中⇒英,英⇒中 Alt+Caps Lock あ⇒カ,A⇒あ⇒カ Ctrl+Caps Loc ...
- JS 对输入判断变化屏蔽中文输入法连续输入时触发的事件
//智能搜索提示 IntelligenceSearch: function IntelligenceSearch() { $('#keyWord').on('input', function () { ...
- 屏蔽win10中文输入法
Windows 10自带的默认输入法,是通过Shift键来切换中/英文,这样为玩一些不需要打字,却需要使用Shift键的游戏带来了不便,比如,在进行游戏的时候,按下Shift键后,再按跳跃.射击等键, ...
- 修改windows自带的Ctrl+Space输入法切换快捷键
使用场景: 多为我等码农使用一些编辑器时,编辑器的默认代码提示热键为 ctrl+space ,但这个热键被系统的输入法开关占用.如果遇到可以设置快捷键的编辑器还好,要是不能设置的话(比如火狐浏览器的代 ...
- Windows 10输入法已禁用IME无法输入中文怎么办
Windows 10输入法已禁用IME无法输入中文怎么办 | 浏览:10453 | 更新:2015-03-01 14:46 | 标签:windows 1 2 3 4 5 分步阅读 Windows10系 ...
- [HTML]输入框被限制输入某些类型数据
ENTER键可以让光标移到下一个输入框 <input onkeydown="if(event.keyCode==13)event.keyCode=9" > 只能是中文& ...
- JS-中对表单处理
一.表单的基本介绍 1. HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是HTMLFormElement 类型. HTMLFormElemen ...
- WPF中TextBox限制输入不起作用的问题
最近再用textbox做限制输入时遇到一个莫名其妙的问题: 首先看代码: <TextBox Name="txtip1" Height="40" Widt ...
随机推荐
- HTML中的a标签实现点击下载
通常在咱们写项目的时候会遇到上传下载什么的,在上传完文件后会把文件的路径保存到数据库里以便下载,如果想不通过后台直接下载的话,可以把文件路径给a标签的属性href: <a href=" ...
- option触发事件两种方法总结
代码如下: <!doctype html> <html> <head> <meta charset="UTF-8"> <tit ...
- [Linux] - xxx 不在 sudoers 文件中。此事将被报告。
redhat系统: linux中创建用户命令为:useradd 用户名, eg: useradd test 指定密码:passwd test 但是有时候我们需要使用test运行执行一些root用户才有 ...
- Java之路——敬JAVA初学者(作者:MoMo)
作为一名大四的毕业生,大学三年过,有得有失.作为一个喜欢编程,喜欢JAVA的人,自学其实是一件美事,很有意思的事.要是能再找个女朋友一起学.嘿嘿,就不枉在大学走了一遭啊! 要离开学校了,还是想留 ...
- BZOJ 3083: 遥远的国度(树链剖分+DFS序)
可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y ...
- Python脚本收集腾讯云CDN日志,并入ELK日志分析
负责搭建公司日志分析,一直想把CDN日志也放入到日志分析,前些日志终于达成所愿,现在贴出具体做法: 1.收集日志 腾讯云CDN日志一般一小时刷新一次,也就是说当前只能下载一小时之前的日志数据,但据本人 ...
- Java设计模式之《组合模式》及应用场景
摘要: 原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/6489827.html 组合模式,就是在一个对象中包含其他对象,这些被包含的对象可能是 ...
- 原生js中slice()方法和splice()区别
slice()方法和splice()方法都是原生js中对数组操作的方法. slice(),返回一个新的数组,该方法可从已有的数组中返回选定的元素.例如:arrObject(start,end),sta ...
- solr6.4.1搜索引擎同步mysql数据库
尚未成功启动solr的,请参考我的另一篇文章:http://www.cnblogs.com/zhuwenjoyce/p/6506359.html(solr6.4.1 搜索引擎启动eclipse启动) ...
- js原生Ajax 的封装和原理
原理及概念 AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是一种用于创建快速动态网页的技术. 动态网页:是指可以通过服务器语言结合数 ...