初衷
本人的英语一塌糊涂,经常性的单词拼写错误!导致在和其他项目对接时闹出笑话。所以,既然人力无法改变,那就让科技来吧!!!(尴尬。。。
README!
因为
它是基于C#开发出的Winform程序;
它是基于百度翻译进行开发的;
它的服务对象是代码工作者;
所以
它需要.Net4.5的环境;
它需要联网;
它只有中-英翻译模式,且翻译规则为驼峰。
使用
界面可以选择翻译键(目前只有鼠标按键);
Ctrl + C选取你要翻译的文本 ——> 点击翻译按键 ——> Ctrl + V粘贴翻译后的内容。
设计
软件功能图:
软件流程图:
攻坚
全局响应:
// An highlighted block
class MouseHook
{
public event System.Windows.Forms.MouseEventHandler MouseDownEvent;
public event System.Windows.Forms.MouseEventHandler MouseClickEvent;
public event System.Windows.Forms.MouseEventHandler MouseUpEvent;
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
static int hMouseHook = 0; //声明鼠标钩子处理的初始值
public const int WH_MOUSE_LL = 14; //线程键盘钩子监听鼠标消息设为2,全局键盘监听鼠标消息设为13
HookProc MouseHookProcedure; //声明MouseHookProcedure作为HookProc类型
//使用此功能,安装了一个钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
//调用此函数卸载钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
//使用此功能,通过信息钩子继续下一个钩子
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam);
// 取得当前线程编号(线程钩子需要用到)
[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId();
//使用WINDOWS API函数代替获取当前实例的函数,防止钩子失效
[DllImport("kernel32.dll")]
public static extern IntPtr GetModuleHandle(string name);
public void Start()
{
// 安装键盘钩子
if (hMouseHook == 0)
{
MouseHookProcedure = new HookProc(MouseHookProc);
hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProcedure, GetModuleHandle(System.Diagnostics.Process.GetCurrentProcess().MainModule.ModuleName), 0);
//hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProcedure, Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]), 0);
//如果SetWindowsHookEx失败
if (hMouseHook == 0)
{
Stop();
throw new Exception("安装键盘钩子失败");
}
}
}
public void Stop()
{
bool retMouse = true;
if (hMouseHook != 0)
{
retMouse = UnhookWindowsHookEx(hMouseHook);
hMouseHook = 0;
}
if (!(retMouse)) throw new Exception("卸载钩子失败!");
}
//鼠标结构体
[StructLayout(LayoutKind.Sequential)]
public class MouseHookStruct
{
public Point pt;
public int hwnd;
public int wHitTestCode;
public int dwExtraInfo;
}
private const int WM_MOUSEMOVE = 0x200;
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_RBUTTONDOWN = 0x204;
private const int WM_MBUTTONDOWN = 0x207;
private const int WM_LBUTTONUP = 0x202;
private const int WM_RBUTTONUP = 0x205;
private const int WM_MBUTTONUP = 0x208;
private const int WM_LBUTTONDBLCLK = 0x203;
private const int WM_RBUTTONDBLCLK = 0x206;
private const int WM_MBUTTONDBLCLK = 0x209;
private int MouseHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
// 侦听键盘事件
if ((nCode >= 0) && (MouseDownEvent != null || MouseUpEvent != null || MouseClickEvent != null))
{
MouseHookStruct mouseHookStruct = (MouseHookStruct)Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
//鼠标单击
//if (MouseClickEvent != null && (wParam == WM_KEYDOWN || wParam == WM_SYSKEYDOWN))
//{
// Keys keyData = (Keys)MyKeyboardHookStruct.vkCode;
// System.Windows.Forms.KeyEventArgs e = new System.Windows.Forms.KeyEventArgs(keyData);
// KeyDownEvent(this, e);
//}
//鼠标按下
if (MouseDownEvent != null && (wParam == WM_LBUTTONDOWN || wParam == WM_RBUTTONDOWN || wParam == WM_MBUTTONDOWN))
{
MouseButtons btn = MouseButtons.None;
switch (wParam)
{
case WM_LBUTTONDOWN:
{
btn = MouseButtons.Left;
break;
}
case WM_RBUTTONDOWN:
{
btn = MouseButtons.Right;
break;
}
case WM_MBUTTONDOWN:
{
btn = MouseButtons.Middle;
break;
}
}
MouseEventArgs e = new MouseEventArgs(btn, 1, mouseHookStruct.pt.X, mouseHookStruct.pt.Y, 0);
MouseDownEvent(this, e);
}
}
//如果返回1,则结束消息,这个消息到此为止,不再传递。
//如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
~MouseHook()
{
Stop();
}
}
结语
开发用时,1个小时。基础功能已ok,但过于丑陋。大家看着拿去装修即可。巴拉巴拉…
源码地址:https://github.com/Dream9898123/Translate.git
开盖及食:链接: https://pan.baidu.com/s/1nZSh5qCOHR7vEdwVG603qw 提取码: bwq8