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 ...
随机推荐
- Python抓取第一网贷中国网贷理财每日收益率指数
链接:http://www.p2p001.com/licai/index/id/147.html 所需获取数据链接类似于:http://www.p2p001.com/licai/shownews/id ...
- [Bullet3]三种碰撞检测及实现
官方文档:http://bulletphysics.org 开源代码:https://github.com/bulletphysics/bullet3/releases API文档:http://bu ...
- python实现多变量线性回归(Linear Regression with Multiple Variables)
本文介绍如何使用python实现多变量线性回归,文章参考NG的视频和黄海广博士的笔记 现在对房价模型增加更多的特征,例如房间数楼层等,构成一个含有多个变量的模型,模型中的特征为( x1,x2,..., ...
- 【前端】:JavaScript
前言: 开始学JavaScript,Dom,jQuery了,知识好杂,本身记忆力就不行的~~这篇博客简单介绍下JavaScript. 下篇博客写关于Dom的. JavaScript是一门编程语言(之前 ...
- weex官方demo weex-hackernews代码解读(1)
一.介绍 weex 是阿里出品的一个类似RN的框架,可以使用前端技术来开发移动应用,实现一份代码支持H5,IOS和Android.最新版本的weex已默认将vue.js作为前端框架,而weex-hac ...
- C语言的基本概念
1.经典入门:hello world #include <stdio.h> int main(void) { printf("hello world.\n"); ; } ...
- Spring框架中 配置c3p0连接池 完成对数据库的访问
开发准备: 1.导入jar包: ioc基本jar jdbcTemplate基本jar c3p0基本jar 别忘了mysql数据库驱动jar 原始程序代码:不使用配置文件方式(IOC)生成访问数据库对象 ...
- 关于hive ,eclipse老是提示加载不到驱动
忙活了好长时间,很纳闷为什么加载不上驱动,驱动包.hive的依赖包.hadoop的依赖包也引入了,各种百度最后: hadoop-2.2.0/share/hadoop/common/hadoop-com ...
- VisualStudio2017下ASP.NET CORE的TagHelper智能提示解决办法
之前在VS2017RC中就发现该问题,安装了依赖,但是前段一直点不出来asp-for,后来查了发行说明, 才知道在VS2017rc中暂时无法解决,所以一直等到VS2017正式版的发布,急冲冲的装好, ...
- 设置debian的静态IP
欲设置的信息: IP地址:198.9.146.131 子网掩码:255.255.255.0 网关:198.9.146.254 DNS:198.9.9.1 198.9.9.2 首先编辑/etc/netw ...