有三个三角了,呵呵!散分

andy1118 2010-09-29 12:54:55
昨天看到有人说老师要求他用C#做一个输入法,然后大家说用.net根本没必要做

在此先不说有没有必要,我就想了一下,如果让我用C#去做一个输入法,是否有这个能力

今天上午找了些资料,感觉实现也不是很困难。现将实现思路及主要代码贴出来
(注意我这是一个外挂式输入法,不是IME式)

首先要有个字典,就是用户输入 英文 变为 中文。
比如:我用五笔 ,
输入 a 按空格 电脑会输入 工,
输入 aa 按空格 电脑会输入 式,

这个我想会C#的,都会
SortedDictionary<string, string> words = new SortedDictionary<string, string>();
words.Add("A", "工");
words.Add("AA", "式");

其次就是键盘钩子了,就是
输入A再空格时,电脑要将A屏蔽,然后输入 工
输入AA再空格时,电脑要将AA屏蔽,然后输入 式

安装钩子
public delegate int HookProc(int nCode, int wParam, IntPtr lParam);
HookProc KeyboardHookProcedure;
static int hHook = 0;

[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn,IntPtr hInstance, int threadId);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern IntPtr GetModuleHandle(string lpModuleName);

if (hHook == 0)
{
KeyboardHookProcedure = new HookProc(KeyboardHookProc);
Process curProcess = Process.GetCurrentProcess();
ProcessModule curModule = curProcess.MainModule;
hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, GetModuleHandle(curModule.ModuleName), 0);
//If SetWindowsHookEx fails.
if (hHook == 0)
{
MessageBox.Show("SetWindowsHookEx Failed");
return;
}

卸载钩子
[DllImport("user32.dll", CharSet = CharSet.Auto,CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);

bool ret = UnhookWindowsHookEx(hHook);
if (ret == false)
{
MessageBox.Show("UnhookWindowsHookEx Failed");
return;
}
hHook = 0;

定义键盘钩子结构
public struct KeyboardHookStruct
{
public int vkCode;
public int scanCode;
public int flags;
public int time;
public int dwExtraInfo;
}

定义键盘钩子处理函数(也就是将用户输入的英文变为中文,并屏蔽键盘按键)
private int KeyboardHookProc(int nCode, int wParam, IntPtr lParam)
{
if (nCode >= 0)
{
KeyboardHookStruct MyKBHookStruct = (KeyboardHookStruct)Marshal.PtrToStructure(lParam, typeof(KeyboardHookStruct));
Keys keyData = (Keys)MyKBHookStruct.vkCode;
if (wParam == WM_KEYDOWN)
{
if (keyData == Keys.Space)
{
SendKeys.Send(words[sb1.ToString()]);
sb1.Remove(0, sb1.Length);
}
else
{
sb1.Append(keyData);
}
return 1;
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
...全文
198 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
shenrujun 2010-09-30
  • 打赏
  • 举报
回复
贺喜来了……
andy1118 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wuyazhe 的回复:]
这些都是细节,关键在于汉字编码和索引。像你这样用字典,那会很累赘的,比如词语呢?你是想实现五笔输入?数据结构不太合理。用树。
[/Quote]

谢谢指导,我并不想也不需要编个输入法

我就想试试自己是否有这个思考能力 ,并能否将思想变为代码
fengzhishangfang 2010-09-29
  • 打赏
  • 举报
回复
兔子-顾问 2010-09-29
  • 打赏
  • 举报
回复
这些都是细节,关键在于汉字编码和索引。像你这样用字典,那会很累赘的,比如词语呢?你是想实现五笔输入?数据结构不太合理。用树。
q107770540 2010-09-29
  • 打赏
  • 举报
回复
porschev 2010-09-29
  • 打赏
  • 举报
回复
三个三角很性感的说。。。昨天帖子回过了。。。
边城的刀声 2010-09-29
  • 打赏
  • 举报
回复
我很喜欢唱andy这首歌
waverq2001 2010-09-29
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
温溪 2010-09-29
  • 打赏
  • 举报
回复
捷哥1999 2010-09-29
  • 打赏
  • 举报
回复
不错,这个劲要保持!
fangxiaofelix 2010-09-29
  • 打赏
  • 举报
回复
恭喜LZ,接分,顶上!我咋才一个(⊙o⊙)?
gentlelhn 2010-09-29
  • 打赏
  • 举报
回复
听说回复可以得到楼主给的分儿~~
24K純帥 2010-09-29
  • 打赏
  • 举报
回复
恭喜恭喜额~
hanbingnertel 2010-09-29
  • 打赏
  • 举报
回复
我咋一个三角也没呢?
马老虎 2010-09-29
  • 打赏
  • 举报
回复
纯唇Yu弄 2010-09-29
  • 打赏
  • 举报
回复
ajq1989 2010-09-29
  • 打赏
  • 举报
回复
laomengzi 2010-09-29
  • 打赏
  • 举报
回复
恭喜lz了,我还不知道哪天有两个星呢!
Ryan20082009 2010-09-29
  • 打赏
  • 举报
回复
等待移贴
huminghua 2010-09-29
  • 打赏
  • 举报
回复
恭喜@@@@@
加载更多回复(15)

110,566

社区成员

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

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

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