有三个三角了,呵呵!散分
昨天看到有人说老师要求他用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);
}