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 ...
随机推荐
- js定时函数
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html& ...
- React库
一.React概述 React是一个是一个开源的js库,用来为数据渲染视图的,由facebook,Instagram社区维护的.(例如美团.阿里.airbnb都在使用React开发) 为什么会出现Re ...
- linux php安装memcached扩展
memcached的安装包括:1.服务端的安装:2.客户端的安装 一.服务器端安装 方法一: memcached 依赖于libevent 库,因此我们需要先安装libevent. 假设将源码放在/us ...
- C语言陷阱:浮点运算
在Stack overflow上看到这样一个问题. 计算如下表达式的值: P=(1/2-3/4)*(5/6-7/8)*…*[n/(n-1) - (n+2)/(n+3)]. 程序如下: #include ...
- Centos更换yum源
Centos更换yum源 步骤如下: 备份原始源 cd /etc/yum.repos.d/ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/ ...
- [译]如何在Web开发中使用Python
[译]如何在Web开发中使用Python 原文:HOWTO Use Python in the Web 摘要 这篇文档展示了Python如何融入到web中.它介绍了几种Python结合web服务器的方 ...
- OpenCv 2.4.9 (二) 核心函数
前言 经过前面一节的怎样读取图片,我们可以做一些有趣的图像变换,下面我们首先介绍使用遍历的方法实现,然后我们使用内置的函数实现. 矩阵掩码实现 矩阵掩码,和卷积神经网络中的卷积类似.一个例子如下: 现 ...
- Javascript几种跨域方式总结
在客户端编程语言中如javascript,同源策略规定跨域之间的脚本是隔离的,一个域的脚本不能访问和操作另外一个域的绝大部分属性和方法.只有当两个域具有相同的协议,相同的主机,相同的端口时,我们就认定 ...
- HttpRequest获取文件流,HttpResponse输出文件流
HttpResponse输出文件: Response.Clear(); Response.ContentType = "application/octet-stream"; //通 ...
- angular2入门,就这一篇就够了
背景与概念: AngularJS2 是一款开源JavaScript库,由Google维护,用来协助单一页面应用程序运行. AngularJS2 是 Angular 1.x 的升级版本,性能上得到显著的 ...