C#中汉字转日文カタカナ失败

sdu_hanson 2013-05-22 02:01:17
采取的方式是调用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;



为啥呢?


...全文
185 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdu_hanson 2013-05-22
  • 打赏
  • 举报
回复
引用 1 楼 Chinajiyong 的回复:
调试一下,看弹出Message后,进入GetReverseConversion方法看
其实就是这句的问题, IntPtr hIMC = ImmGetContext(AHwnd); 返回零,不知道为什么
EnForGrass 2013-05-22
  • 打赏
  • 举报
回复
调试一下,看弹出Message后,进入GetReverseConversion方法看

110,570

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧