在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输入法的更多相关文章

  1. JS对输入判断变化屏蔽中文输入法输入时连续触发事件的方法

    代码如下: //智能搜索提示 IntelligenceSearch: function IntelligenceSearch() { $('#keyWord').on('input', functio ...

  2. Windows10输入法的切换

    Alt+Shift            中⇒あ,あ⇒中 Shift                  中⇒英,英⇒中 Alt+Caps Lock    あ⇒カ,A⇒あ⇒カ Ctrl+Caps Loc ...

  3. JS 对输入判断变化屏蔽中文输入法连续输入时触发的事件

    //智能搜索提示 IntelligenceSearch: function IntelligenceSearch() { $('#keyWord').on('input', function () { ...

  4. 屏蔽win10中文输入法

    Windows 10自带的默认输入法,是通过Shift键来切换中/英文,这样为玩一些不需要打字,却需要使用Shift键的游戏带来了不便,比如,在进行游戏的时候,按下Shift键后,再按跳跃.射击等键, ...

  5. 修改windows自带的Ctrl+Space输入法切换快捷键

    使用场景: 多为我等码农使用一些编辑器时,编辑器的默认代码提示热键为 ctrl+space ,但这个热键被系统的输入法开关占用.如果遇到可以设置快捷键的编辑器还好,要是不能设置的话(比如火狐浏览器的代 ...

  6. Windows 10输入法已禁用IME无法输入中文怎么办

    Windows 10输入法已禁用IME无法输入中文怎么办 | 浏览:10453 | 更新:2015-03-01 14:46 | 标签:windows 1 2 3 4 5 分步阅读 Windows10系 ...

  7. [HTML]输入框被限制输入某些类型数据

    ENTER键可以让光标移到下一个输入框 <input onkeydown="if(event.keyCode==13)event.keyCode=9" > 只能是中文& ...

  8. JS-中对表单处理

    一.表单的基本介绍 1. HTML 中,表单是由<form>元素来表示的,而在 JavaScript 中,表单对应的则是HTMLFormElement 类型. HTMLFormElemen ...

  9. WPF中TextBox限制输入不起作用的问题

    最近再用textbox做限制输入时遇到一个莫名其妙的问题: 首先看代码: <TextBox  Name="txtip1" Height="40" Widt ...

随机推荐

  1. C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)

    译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)),不对的地方欢迎指出与交流. 章节出自<Professional C ...

  2. PHP 中使用 Composer

    在线安装版本: http://www.phpcomposer.com/ 这个是国内的composer网站 thinkphp5自带了composer.phar组件,如果没有安装,则需要进行安装 以下命令 ...

  3. PHP基础学习

    PHP基础学习 <?php //类型 $test=123; var_dump($test);//打印出类型和数值 echo '<hr/>'; echo gettype($test); ...

  4. 《半吊子全栈系列:Boostrap3》

    前言:后端开发做网站 几年前,作为一名纯粹后端Java开发人员,对JS还没开窍,对于页面只停留在<十天学会DIV+CSS>这种程度,但是我又想做网站怎么办? 这时候Boostrap3出现了 ...

  5. FastDFS+Nginx部署详细教程

    本例使用到的所有tar和zip包地址:http://download.csdn.net/detail/corey_jk/9758664 本例中使用CentOS1.CentOS2两台机器实现. 1 GC ...

  6. CHM文件无法打开的解决方法

    转载请注明来自:http://www.yaosansi.com原文地址:http://www.yaosansi.com/post/cannot_open_chm_file.html 目录:一.正确操作 ...

  7. Python求解登楼梯问题(京东2016笔试题)

    问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法? 解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一 ...

  8. nodejs爬虫——汽车之家所有车型数据

    应用介绍 项目Github地址:https://github.com/iNuanfeng/node-spider/ nodejs爬虫,爬取汽车之家(http://www.autohome.com.cn ...

  9. oracle系列笔记(1)---查询数据

    查询数据 1. 查询(select .. form ..)    (1)普通查询 select * from employees --代表查询employees表中所有数据 select last_n ...

  10. PHP字符串三种定义方式

    PHP的字符串有三种定义方式:单引号 .双引号 .定界符  1.单引号:指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来. 在被单引号括起来的字符串中,要再表示一个单引号,需要用反斜线(\ ...