采取的方式是调用com对象处理,下面是核心代码 [DllImport("imm32.dll")]
public static extern IntPtr ImmGetContext(IntPtr hwnd); [DllImport("User32.dll")]
public static extern IntPtr GetKeyboardLayout(int hwnd); [DllImport("imm32.dll")]
public static extern int ImmGetConversionList(IntPtr hKL, IntPtr hIMC, string lpSrc, IntPtr lpDst, int dwBufLen, int uFlag); [DllImport("imm32.dll")]
public static extern bool ImmReleaseContext(IntPtr hwnd, IntPtr hIMC);
const int GCL_REVERSECONVERSION = 0x0002;
[StructLayout(LayoutKind.Sequential)]
public class CANDIDATELIST
{
public int dwSize;
public int dwStyle;
public int dwCount;
public int dwSelection;
public int dwPageStart;
public int dwPageSize;
public int dwOffset;
} public string GetReverseConversion(string AText)
{
IntPtr AHwnd = this.Handle;
string[] strList = null;
IntPtr hIMC = ImmGetContext(AHwnd);
IntPtr hKL = GetKeyboardLayout(0);
if ((hIMC != IntPtr.Zero) && (hKL != IntPtr.Zero))
{
CANDIDATELIST list = new CANDIDATELIST();
int dwSize = ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, GCL_REVERSECONVERSION);
if (dwSize > 0)
{
IntPtr BufList = Marshal.AllocHGlobal(dwSize);
ImmGetConversionList(hKL, hIMC, AText, BufList, dwSize, GCL_REVERSECONVERSION);
Marshal.PtrToStructure(BufList, list);
byte[] buf = new byte[dwSize];
Marshal.Copy(BufList, buf, 0, dwSize);
Marshal.FreeHGlobal(BufList);
int os = list.dwOffset;
string str = System.Text.Encoding.Default.GetString(buf, os, buf.Length - os);
str = Regex.Replace(str, @"\0+$", "");
char[] par = "\0".ToCharArray();
strList = str.Split(par);
bool returnValue = ImmReleaseContext(AHwnd, hIMC);
}
}
string katakana = Microsoft.VisualBasic.Strings.StrConv(strList[0], Microsoft.VisualBasic.VbStrConv.Katakana, 0);
return Microsoft.VisualBasic.Strings.StrConv(katakana, Microsoft.VisualBasic.VbStrConv.Narrow, 0); ;
} 现在有个问题,假设点button后直接处理,不会出异常:string text_kana = GetReverseConversion(this.textBox1.Text);
this.textBox2.Text = text_kana; 但是如果先弹出message后,便出现nullreference异常,MessageBox.Show("メッセージ表示");
string text_kana = GetReverseConversion(this.textBox1.Text);
this.textBox2.Text = text_kana; 为啥呢?
public static extern IntPtr ImmGetContext(IntPtr hwnd); [DllImport("User32.dll")]
public static extern IntPtr GetKeyboardLayout(int hwnd); [DllImport("imm32.dll")]
public static extern int ImmGetConversionList(IntPtr hKL, IntPtr hIMC, string lpSrc, IntPtr lpDst, int dwBufLen, int uFlag); [DllImport("imm32.dll")]
public static extern bool ImmReleaseContext(IntPtr hwnd, IntPtr hIMC);
const int GCL_REVERSECONVERSION = 0x0002;
[StructLayout(LayoutKind.Sequential)]
public class CANDIDATELIST
{
public int dwSize;
public int dwStyle;
public int dwCount;
public int dwSelection;
public int dwPageStart;
public int dwPageSize;
public int dwOffset;
} public string GetReverseConversion(string AText)
{
IntPtr AHwnd = this.Handle;
string[] strList = null;
IntPtr hIMC = ImmGetContext(AHwnd);
IntPtr hKL = GetKeyboardLayout(0);
if ((hIMC != IntPtr.Zero) && (hKL != IntPtr.Zero))
{
CANDIDATELIST list = new CANDIDATELIST();
int dwSize = ImmGetConversionList(hKL, hIMC, AText, IntPtr.Zero, 0, GCL_REVERSECONVERSION);
if (dwSize > 0)
{
IntPtr BufList = Marshal.AllocHGlobal(dwSize);
ImmGetConversionList(hKL, hIMC, AText, BufList, dwSize, GCL_REVERSECONVERSION);
Marshal.PtrToStructure(BufList, list);
byte[] buf = new byte[dwSize];
Marshal.Copy(BufList, buf, 0, dwSize);
Marshal.FreeHGlobal(BufList);
int os = list.dwOffset;
string str = System.Text.Encoding.Default.GetString(buf, os, buf.Length - os);
str = Regex.Replace(str, @"\0+$", "");
char[] par = "\0".ToCharArray();
strList = str.Split(par);
bool returnValue = ImmReleaseContext(AHwnd, hIMC);
}
}
string katakana = Microsoft.VisualBasic.Strings.StrConv(strList[0], Microsoft.VisualBasic.VbStrConv.Katakana, 0);
return Microsoft.VisualBasic.Strings.StrConv(katakana, Microsoft.VisualBasic.VbStrConv.Narrow, 0); ;
} 现在有个问题,假设点button后直接处理,不会出异常:string text_kana = GetReverseConversion(this.textBox1.Text);
this.textBox2.Text = text_kana; 但是如果先弹出message后,便出现nullreference异常,MessageBox.Show("メッセージ表示");
string text_kana = GetReverseConversion(this.textBox1.Text);
this.textBox2.Text = text_kana; 为啥呢?
IntPtr hIMC = ImmGetContext(AHwnd);
返回零,不知道为什么