主要使用WIN32API函数 FindWindowEx ,SendMessage,PostMessage等
引用WIN32API函数
// Find Window // 查找窗体 // @para1: 窗体的类名 例如对话框类是"#32770" // @para2: 窗体的标题 例如打开记事本 标题是"无标题 - 记事本" 注意 - 号两侧的空格 // return: 窗体的句柄 [DllImport("User32.dll", EntryPoint = "FindWindow")] public static extern IntPtr FindWindow(string className, string windowName); // Find Window Ex // 查找窗体的子窗体 // @para1: 父窗体的句柄 如果为null,则函数以桌面窗口为父窗口,查找桌面窗口的所有子窗口 // @para2: 子窗体的句柄 如果为null,从@para1的直接子窗口的第一个开始查找 // @para3: 子窗体的类名 为""表示所有类 // @para4: 子窗体的标题 为""表示要查找的窗体无标题 如空白的textBox控件 // return: 子窗体的句柄 [DllImport("user32.dll", EntryPoint = "FindWindowEx")] private static extern IntPtr FindWindowEx( IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); // SendMessage // 向窗体发送消息 // @para1: 窗体句柄 // @para2: 消息类型 // @para3: 附加的消息信息 // @para4: 附加的消息信息 [DllImport("User32.dll", EntryPoint = "SendMessage")] private static extern int SendMessage( IntPtr hWnd, int Msg, IntPtr wParam, string lParam); //与SendMessage区别在与 SendMessage是阻塞,而PostMessage为异步 [DllImport("User32.dll", EntryPoint = "PostMessage")] private static extern bool PostMessage( IntPtr hWnd, int Msg, IntPtr wParam, string lParam); // 消息类型(部分) const int WM_GETTEXT = 0x000D; // 获得窗体文本 如获得对话框标题 const int WM_SETTEXT = 0x000C; // 设置窗体文本 如设置文本框内容 const int WM_CLICK = 0x00F5; // 发送点击消息如调用该窗体(按钮)的"button1_Click();" const int WM_COPYDATA = 0x004A; const int WM_CTLCOLORBTN = 0x0135; const int WM_PASTE = 0x0302; const int WM_COMMAND = 0x0111;
主要程序
IntPtr Wnd = new IntPtr(0);// 主窗体 IntPtr txt1 = new IntPtr(0);// 文本框 IntPtr txt2 = new IntPtr(0);// 文本框 IntPtr txt3 = new IntPtr(0);// 文本框 IntPtr txt4 = new IntPtr(0);// 文本框 IntPtr txt5 = new IntPtr(0);// 文本框 IntPtr btn1 = new IntPtr(0);// 查询按钮 Wnd = FindWindowEx((IntPtr)0, (IntPtr)0, null, "标题名");// 主窗体 //Gnd = FindWindowEx(Wnd, (IntPtr)0, null, "基本操作选项:"); // textBox控 //Twn = FindWindowEx(Wnd, (IntPtr)0, null, "选择密匙"); txt1 = FindWindowEx(Wnd, (IntPtr)0, null, ""); // textBox控件 txt2 = FindWindowEx(Wnd, txt1, null, ""); // textBox控件 txt3 = FindWindowEx(Wnd, txt2, null, ""); // textBox控件 txt4 = FindWindowEx(Wnd, txt3, null, ""); // textBox控件 txt5 = FindWindowEx(Wnd, txt4, null, ""); // textBox控件 btn1 = FindWindowEx(Wnd, (IntPtr)0, null, "保护"); // 按钮 if (SendMessage(txt4, WM_SETTEXT, (IntPtr)0, path_temp_exe) == 0) return false; if (SendMessage(txt5, WM_SETTEXT, (IntPtr)0, path_ntclt_exe) == 0) return false; EnableWindow(btn1, true);//使变灰的按钮可用! Clipboard.Clear();//清除剪贴板 Clipboard.SetText("string");复制字符到剪切板 if (!PostMessage(btn1, WM_CLICK, (IntPtr)0, "")) return false; SendMessage(txt3, WM_PASTE, (IntPtr)0, ""); //复制剪切板内容到txt3 IntPtr m_com = new IntPtr(10); if (!(PostMessage(Wnd, WM_COMMAND, m_com, null))) return false; ////触发窗体菜单ID为10的单击事件,菜单ID可以用SPY++获取