Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA键盘西里尔字母输入_C#_Encoding_Xna_Keyboard Hook - Fatal编程技术网

C# XNA键盘西里尔字母输入

C# XNA键盘西里尔字母输入,c#,encoding,xna,keyboard-hook,C#,Encoding,Xna,Keyboard Hook,我想在我的XNA游戏中添加一个输入西里尔字母的可能性。 我无法使用默认的Input.KeyboardState,因为Input.Keys枚举仅包含英文字母。所以,我使用键盘挂钩来处理Windows输入。但它返回keycode,可以用于英文字母(因为ASCII码与键码匹配),但不能正确使用西里尔字母。对于“a-Ö”可以使用848偏移量,但对于更具体的字母,如“і”或“ї”,则有不同的值 有没有有效的方法将密钥代码转换成ASCII格式的西里尔字母?或者也许有一个解决方案没有讨厌的键盘钩 顺便说一句,

我想在我的XNA游戏中添加一个输入西里尔字母的可能性。 我无法使用默认的Input.KeyboardState,因为Input.Keys枚举仅包含英文字母。所以,我使用键盘挂钩来处理Windows输入。但它返回keycode,可以用于英文字母(因为ASCII码与键码匹配),但不能正确使用西里尔字母。对于“a-Ö”可以使用848偏移量,但对于更具体的字母,如“і”或“ї”,则有不同的值

有没有有效的方法将密钥代码转换成ASCII格式的西里尔字母?或者也许有一个解决方案没有讨厌的键盘钩

顺便说一句,这里是键盘钩子类列表:

#地区事件参数
公共类字符EventArgs:EventArgs
{
私有只读字符;
专用只读int LPRAM;
私有只读int键布局;
public CharacterEventArgs(字符、int lParam、int keyLayout)
{
这个。字符=字符;
this.lParam=lParam;
this.keyLayout=keyLayout;
}
#区域属性
公钥布局
{
获取{return keyLayout;}
}
公共字符
{
获取{返回字符;}
}
公共int参数
{
获取{return lParam;}
}
公共整数重复计数
{
获取{return lParam&0xffff;}
}
公共布尔扩展密钥
{
获取{return(lParam&(10;}
}
公共图书馆
{
获取{return(lParam&(10;}
}
公共布尔先前状态
{
获取{return(lParam&(10;}
}
公共布尔过渡状态
{
获取{return(lParam&(10;}
}
#端区
}
公共类KeyEventArgs:EventArgs
{
私钥密钥码;
公钥事件参数(密钥密钥代码)
{
this.keyCode=keyCode;
}
公钥密码
{
获取{return keyCode;}
}
}
#端区
#地区代表团
公共委托void CharEnteredHandler(对象发送方,CharacterEventArgs e);
公共委托void KeyEventHandler(对象发送方,KeyEventArgs e);
#端区
公共静态类EventInput
{
#地区活动
/// 
///输入字符时引发的事件。
/// 
公共静态事件CharEnteredHandler CharEntered;
/// 
///按下某个键时引发的事件。由于键盘重复,可能会触发多次。
/// 
公共静态事件KeyEventHandler KeyDown;
/// 
///释放密钥时引发的事件。
/// 
公共静态事件KeyEventHandler KeyUp;
#端区
代表IntPtr WndProc(IntPtr hWnd、uint msg、IntPtr wParam、IntPtr lParam);
静态布尔初始化;
静态IntPtr prevWndProc;
静态WndProc代理;
静态IntPtr-hIMC;
静态游戏窗口游戏窗口;
#区域常数
const int GWL_WNDPROC=-4;
常量int WM_KEYDOWN=0x100;
常量int WM_KEYUP=0x101;
常量int WM_CHAR=0x102;
常量int WM_IME_SETCONTEXT=0x0281;
常量int WM_INPUTLANGCHANGE=0x51;
常量int WM_GETDLGCODE=0x87;
常量int WM_IME_COMPOSITION=0x10f;
const int DLGC_WANTALLKEYS=4;
#端区
#区域Win32函数
//处理输入
[DllImport(“Imm32.dll”)]
静态外部IntPtr ImmGetContext(IntPtr hWnd);
[DllImport(“Imm32.dll”)]
静态外部IntPtr ImmAssociateContext(IntPtr hWnd、IntPtr hIMC);
[DllImport(“user32.dll”)]
静态外部IntPtr CallWindowProc(IntPtr lpPrevWndFunc、IntPtr hWnd、uint Msg、IntPtr wParam、IntPtr lpram);
[DllImport(“user32.dll”)]
静态外部int SetWindowLong(IntPtr hWnd、intnindex、intdwnewlong);
//获取键盘布局的步骤
[DllImport(“user32.dll”,SetLastError=true)]
静态外部int GetWindowThreadProcessId(
[In]IntPtr hWnd,
[输出,可选]IntPtr lpdwProcessId
);
[DllImport(“user32.dll”,SetLastError=true)]
静态外部ushort GetKeyboardLayout(
[In]int-idThread
);
#端区
静态ushort GetKeyboardLayout()
{
返回GetKeyboardLayout(GetWindowThreadProcessId(gameWindow.Handle,IntPtr.Zero));
}
#区域初始化
/// 
///使用给定的游戏窗口初始化TextInput。
/// 
///文本输入应链接到的XNA窗口。
公共静态无效初始化(游戏窗口)
{
如果(已初始化)
抛出新的InvalidOperationException(“TextInput.Initialize只能调用一次!”);
游戏窗口=窗口;
hookProcDelegate=新WndProc(HookProc);
prevWndProc=(IntPtr)SetWindowLong(window.Handle,GWL_WNDPROC,
(int)Marshal.GetFunctionPointerForDelegate(hookProcDelegate));
hIMC=ImmGetContext(window.Handle);
初始化=真;
}
#端区
静态IntPtr HookProc(IntPtr hWnd、uint msg、IntPtr wParam、IntPtr lParam)
{
IntPtr returnCode=CallWindowProc(prevWndProc、hWnd、msg、wParam、lParam);
开关(msg)
{
案例WM_GETDLGCODE:
returnCode=(IntPtr)(returnCode.ToInt32()| DLGC_wantallkies);
打破
案例WM_键控:
if(KeyDown!=null)
KeyDown(null,新的KeyEventArgs((Keys)wParam));
打破
案例WM_KEYUP:
if(KeyUp!=null)
KeyUp(null,新的KeyEventArgs((Keys)wParam));
打破
案例WM_CHAR:
如果(输入字符!=null)
{
CharEntered(null,新的CharacterEventArgs((char)wParam,lParam.ToInt32(),GetKeyboardLayout());
}
打破
案例WM\U IME\U SETCONTEXT:
if(wParam.ToInt32()==1)
非关联上下文(hWnd,hIMC);
打破
案例WM_输入变化:
非关联上下文(hWnd,hIMC);
returnCode=(IntPtr)1;
using System.Windows.Forms;

...

var form = (Form)Form.FromHandle(window.Handle);
form.KeyPress += form_KeyPress;

...

private void form_KeyPress(Object sender, KeyPressEventArgs e)
{  
    Console.WriteLine(e.KeyChar);
    e.Handled = true;
}