读书人

一个有关问题郁闷了两天了

发布时间: 2012-11-03 10:57:44 作者: rapoo

一个问题郁闷了两天了,请教各位。
查到几个用来实现功能的API,但没有例子,不会用啊,

ImmGetRegisterWordStyle
ImmRegisterWord
ImmUnregisterWord

写了程序,实现失败。有人给些点拨么?

我的代码如下:

[ DllImport( "user32.dll " )]
public static extern IntPtr LoadKeyboardLayout( String pwszKLID, UInt32 Flags );
[ DllImport( "imm32.dll " )]
public static extern UInt32 ImmGetRegisterWordStyle( IntPtr hKL, UInt32 nItem, [In, Out] STYLEBUF[] lpStyleBuf );

private void Load(object sender, System.EventArgs e)
{
STYLEBUF[] stlBuff = new STYLEBUF[1];
IntPtr hKL = LoadKeyboardLayout( "E0010411 ", 1);

UInt32 num = ImmGetRegisterWordStyle(hKL, 0, stlBuff);

STYLEBUF[] stlBuff1 = new STYLEBUF[num];
UInt32 rc = ImmGetRegisterWordStyle(hKL, num, stlBuff1);
}
}

public struct STYLEBUF
{
Int32 dwStyle;
[ MarshalAs( UnmanagedType.ByValTStr, SizeConst=32 )]
String szDescription;
}

红色部分总是获取不到值,ImmRegisterWord 也总是返回false。不知道哪里写的有问题

[解决办法]
日文输入法怎么弄我也不知道,估计你的错还是HKL没有填对。HKL的高16位是键盘的物理布局,低16位语言标识(Locale ID),中文是2052,日文是1041(0x0411)。
你可以用下面的方法看下系统中到底装了哪些输入法:

C# code
    [DllImport("user32.dll")] public static extern int GetKeyboardLayoutList(int size, [Out, MarshalAs(UnmanagedType.LPArray)] IntPtr[] hkls);    [DllImport("imm32")] public static extern uint ImmGetDescription(IntPtr hKL, StringBuilder lszDescription, uint uBufLen);    [DllImport("imm32")] public static extern uint ImmGetIMEFileName(IntPtr hKL, StringBuilder lpszFileName, uint uBufLen);    static void Main(string[] args)    {        IntPtr[] hkls = new IntPtr[20];        int n = GetKeyboardLayoutList(20, hkls);        Console.WriteLine("{0} layouts:", n);        for (int i = 0; i < n; i++)        {            IntPtr hkl = hkls[i];            var desc = new StringBuilder(500);            ImmGetDescription(hkl, desc, 500);            var fname = new StringBuilder(500);            ImmGetIMEFileName(hkl, fname, 500);            Console.WriteLine("{0}({1}) '{2}' ({3})", hkl.ToString("x"), (int)hkl & 0x00ffff, desc, fname);        }    } 

读书人网 >C#

热点推荐