请教sendmessage的使用!!!

yuquan1987 2010-09-09 08:37:22
最近在看到关于api函数sendmessage的一些用法。

如下:

[DllImport("user32.dll", EntryPoint = "SendMessage", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam);




const int WM_KEYDOWN = 0x0100;
const int WM_SYSKEYDOWN = 0X104;
const int WM_KEYUP = 0x0101;
const int WM_SETTEXT = 0x000C;



const int VK_SHIFT = 0x10;
const int VK_TAB = 0x9;


我已经找到hwndCalc的句柄 但是我用下面的方法 想发送 shift+tab怎么总是没效果呢?

SendMessage(hwndCalc, WM_SYSKEYDOWN, VK_SHIFT, null);//发送shift
SendMessage(hwndCalc, WM_SYSKEYDOWN, VK_TAB, null);//发送tab


SendMessage(hwndCalc, WM_KEYUP, VK_SHIFT, null);//释放shift
SendMessage(hwndCalc, WM_KEYUP, VK_TAB, null);//释放tab


希望各位高手指点指点。
...全文
495 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuquan1987 2010-09-20
  • 打赏
  • 举报
回复
帖子潜水了。一直没人关注。悲哀。结贴吧
yuquan1987 2010-09-16
  • 打赏
  • 举报
回复
顺便还问个问题啊?在winform中如何调用js呢?不用webbrowser调用的。
shinaterry 2010-09-14
  • 打赏
  • 举报
回复
呵呵,还在使用2008的我漂过...
yuquan1987 2010-09-14
  • 打赏
  • 举报
回复
呵呵呵,研究总是有结果的。按照我的思路现在已经可以实现登录,和找到坐标了。这样就模拟鼠标事件了。
期待更多的朋友来关注。。。不然我这100分咋分的出去呢?呵呵
事理 2010-09-13
  • 打赏
  • 举报
回复
楼主能说一下成功登录的思路吗?
gonganruyi 2010-09-13
  • 打赏
  • 举报
回复
好高深!
亲爱的-爹爹 2010-09-13
  • 打赏
  • 举报
回复
不会,学习
llzjyang 2010-09-12
  • 打赏
  • 举报
回复
咋都那么高深(⊙o⊙)?
cjh200102 2010-09-12
  • 打赏
  • 举报
回复
路过。。
liuqilin1987 2010-09-12
  • 打赏
  • 举报
回复
QQ的密码框是加密了的,现在2009以上的版本,加密方法不明,2009以下的版本加密方法好像是先HASH,然后在通过MD5的,但现在不知道了。
让爱延续 2010-09-12
  • 打赏
  • 举报
回复
我是来张见识的。哈哈…
yuquan1987 2010-09-12
  • 打赏
  • 举报
回复
再次谢谢楼上的朋友们来帮顶。我又有进展了,我现在已经实现登陆qq了。
1,但是假如我的密码包含了一些特殊字符,比如@,#,>等等,这些如何发送呢?
2,我登录qq以后,发现整个qq就是一个窗体,更本不像2008版本的那样有多个窗体。我个人认为是不是,以前版本的qq是winform做的,而现在的类似wpf一样。就找不到窗体了?比如我现在要实现自动加好友的功能。我用工具找不到查找的“按钮”(那个还不知道是不是按钮呢,或许就是个图片控件),我现在用了很笨的方式就是 不停的发送tab,开始还行,刚我把qq给卸载了一次。再装好了后发现要发送的tab的次数更改了。这样就说明,不同人安装的qq,我发送的次数就有可能不一样。这样是不是就意味着我的这个方法不可行了?
3,后来我又想了下,我想得到qq的窗口的大小。每次登录后就将大小定义成我事先想好的,然后通过相对坐标来寻找我想要的东西呢?找到坐标了,就模拟鼠标点击。不知可行否?有待各位朋友来指点。我也将进一步研究。
ZengHD 2010-09-11
  • 打赏
  • 举报
回复
QQ、网游都会屏蔽一些API函数,从注入入手,把DLL注入到QQ,然后再发送相关消息,试试
yuquan1987 2010-09-11
  • 打赏
  • 举报
回复
谢谢computerfox,我用工具发现qq的主窗体就一个,根本就没有子窗体,这个该怎么办呢?就比如我要执行某个操作,不就等于无法实现了?
捷哥1999 2010-09-10
  • 打赏
  • 举报
回复
现在能够将qq号输入到QQ号的文本框,并且焦点也能移到密码框,但是就是 SendMessage(pwdChild, WM_SETTEXT, 0, QQPwd);发送密码不成功,不知道是怎么回事

应该是QQ的密码输入框做了特殊的处理,导致的。qq处于安全考虑,密码输入框肯定有特殊的处理。
yuquan1987 2010-09-10
  • 打赏
  • 举报
回复
谢谢楼上的朋友来帮顶!我现在有些新的进展。

现在能找到窗体
IntPtr hwndCalc = GetForegroundWindow();//得到当前的最前端的程序的窗口句柄(这里想法是刚启动qq就获取qq的句柄),缺点是当前启动的程序还没出来,获取的就是别的窗口的句柄了
//IntPtr hwndCalc = FindWindow("TXGuiFoundation", "QQ2010");//这个方法获取句柄的缺点是必须提供类名和窗口标题才能找到唯一确定的
if (hwndCalc != IntPtr.Zero)
{
bool resul = SetForegroundWindow(hwndCalc);//将当前窗口置为最前端
if (resul)
{
//理论上是要遍历当前父窗口下的所有子窗口 找到输入QQ号码的窗口
//这个遍历我还没实现 QQ号码的窗口是第一个子窗口

IntPtr firstChild = FindWindowEx(hwndCalc, null, null, null);//找到了输入QQ号码的窗口
SendMessage(firstChild, WM_SETFOCUS, 0, "0");//设置焦点
Thread.Sleep(5000);
SendMessage(firstChild, WM_SETTEXT, 0, QQID);
Thread.Sleep(5000);
//SendMessage(hwndCalc, WM_KEYDOWN, VK_TAB, "0");//发送tab
//SendMessage(hwndCalc, WM_KEYUP, VK_TAB, "0");//释放tab
IntPtr pwdChild = FindWindowEx(hwndCalc, null, "Edit", null);//这里没办法了,实在是不想通过这个办法找,但是我现在又没办法能找到当前QQ登录框的子窗口的句柄,只能是通过spy++找了。
SendMessage(pwdChild, WM_SETFOCUS, 0, "0");//设置焦点
Thread.Sleep(5000);
SendMessage(pwdChild, WM_SETTEXT, 0, QQPwd);//个人觉得密码要用char一个个的输入
Thread.Sleep(5000);
SendMessage(pwdChild, WM_KEYDOWN, 0x0D, null);//回车
}
}

现在能够将qq号输入到QQ号的文本框,并且焦点也能移到密码框,但是就是 SendMessage(pwdChild, WM_SETTEXT, 0, QQPwd);发送密码不成功,不知道是怎么回事
yuquan1987 2010-09-10
  • 打赏
  • 举报
回复
自己在来顶一下!!!
liulangdeyuyu 2010-09-10
  • 打赏
  • 举报
回复
回帖是一种美德
air123456789 2010-09-10
  • 打赏
  • 举报
回复
标记,标记。为未来做准备。
porschev 2010-09-10
  • 打赏
  • 举报
回复
加载更多回复(10)

110,538

社区成员

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

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

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