这两天一直在写一个驾校约车的辅助软件,参考了下ByPass的通知,然后昨天晚上写了个发送QQ消息的通知
开始在想的是将QQ HOOK后达到我的目的,后来想到一个更简单的。
想法
我们这打开QQ或者Tim消息的时候,当点击它的窗口,我们可以发现,焦点已经到编辑框上了。
通过这个发现,有了个想法
1.模拟点击QQ聊天的窗口,让它放置到最前
2.自动操作键盘打字(发送文本信息)
3.模拟点击Enter键
解决方案
我们需要用到下面几个 user32.dll函数
[DllImport("user32.dll")]
public static extern int GetCursorPos(ref Point lpPoint); //获取鼠标位置
[DllImport("user32.dll")]
public static extern int WindowFromPoint(int xPoint, int yPoint); //获取鼠标位置下的窗口句柄
[DllImport("user32.dll")]
public static extern int GetWindowText(int hwnd, StringBuilder lpString, int nMaxCount); //获取窗口的标题
[DllImport("user32.dll")]
public static extern int GetClassName(int hwnd, StringBuilder lpstring, int nMaxCount); //获取窗口的类名
[DllImport("user32.dll", EntryPoint = "SendMessageA")]
public static extern int SendMessage(int hwnd, int wMsg, int wParam, string lParam);//发送信息,但是貌似没有用到这个
[DllImport("user32.dll")]
public static extern bool SetForegroundWindow(IntPtr hWnd); //把窗口放到最上面
开始获取窗口句柄,使用经典的拖到窗口上获取 下面代码中。。setting为我的设置信息把有setting的改成自己要保存的变量就行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0vxb7Roq-1618916703849)(http://47.94.89.49/wp-content/uploads/2021/02/NS0C5K2LTE88FKEZW27D-300x80.jpg)]
static int hwnd;//窗体句柄
static StringBuilder name = new StringBuilder(256);//接受窗体标题和类名称
Boolean ax = false;
private void panel1_MouseDown(object sender, MouseEventArgs e)
{
ax = true;//鼠标左右键被按下
Cursor = new Cursor(Application.StartupPath+"/data/1.cur"); //改变鼠标样式为十字架
panel1.BackgroundImage = null;
}
private void panel1_MouseUp(object sender, MouseEventArgs e)
{
ax = false;
panel1.BackgroundImage =appointment.Properties.Resources.pointer_128px_1164880_easyicon_net;
Cursor = Cursors.Default;//改变鼠标样式为默认
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
setting.QQMsgName = new StringBuilder(256);
Point pi = new Point();
//当鼠标移动时发生
if (ax)//左键是否被按下
{
String t = "";
GetCursorPos(ref pi);
hwnd = WindowFromPoint(pi.X, pi.Y);//获取坐标下的窗体句柄
GetClassName(hwnd, name, 256);
GetWindowText(hwnd, setting.QQMsgName, 256);//得到窗体的标题
//用来判断是否是QQ或者TIM的窗口,Equals(QQ)是因为如果是QQ的主窗口的话,也可以获取到句柄
if (name.ToString().Equals("TXGuiFoundation") && !setting.QQMsgName.ToString().Equals("QQ"))
{
label22.Text = setting.QQMsgName.ToString();
label23.Text = hwnd.ToString();
setting.QQMsgHw = hwnd;
}
else {
setting.QQMsgName = null;
}
}
}
发送消息
public void send(String title,int hw,String text) {
try
{
if (hw == 0) throw new Exception("");
IntPtr k = (IntPtr)hw;
SetForegroundWindow(k);
SendKeys.SendWait(text); // 键入你要发送的文本
SendKeys.Send("{ENTER}"); // 模拟enter按键
}
catch (Exception ex) {
addLog("没有找到聊天窗口",Color.Red);
}
}