想实现这样的目标:
QQ2004_2版中登录界面有一个"网络设置"的按钮,点击后会有一个展开的对话框,在里面有个"类型",可以选取"不使用代理""SOCKS5代理""HTTP代理""使用浏览器设置",默认情况下是第一个, 现在我想通过拦截消息,实现当用户按下"登录"按钮时,自动选取"HTTP代理",并填上相应的地址和端口,于是我这样做
安装全局消息钩子:
....判断是不是"登录"或"申请QQ"按钮........判断是不是QQ登录窗口...
如果是"登录"或"申请QQ"按钮并且是QQ登录窗口,则//QQ登录框展开(按"网络设置"按钮)
::PostMessage((HWND)pMsg->lParam,WM_COMMAND,0x00003E88,LONG(GetDlgItem((HWND)pMsg->lParam,0x00003E88)));//发送选中"HTTP代理"
::PostMessage(GetDlgItem((HWND)pMsg->lParam,0x00003E81),CB_SETCURSEL,proxytype,NULL);//发送CBN_SELCHANGE(这一步得到 hujun614(Softworm)大侠的指点)
::PostMessage((HWND)pMsg->lParam,WM_COMMAND,0x00013E81,(LONG)GetDlgItem((HWND)pMsg->lParam,0x00003E81));
以上顺利实现,接下来要实现填上IP地址和端口
SetWindowText(IpaddrEdit,"192.168.1.1");//IpaddrEdit为IP地址的EDIT窗口句柄
SetWindowText(IPortEdit,"80");//IPortEdit为端口的EDIT窗口句柄//在这里我发了一个EN_CHANGE给主窗口,告诉他EDIT数据更新::PostMessage((HWND)pMsg->lParam,WM_COMMAND,0x03003E82,IpaddrEdit);但上面这三句都没法实现
现象是SetWindowText(IpaddrEdit,"192.168.1.1");后未见edit窗口出现"192.168.1.1",还是空白
同样SetWindowText(IPortEdit,"80");也未见edit变为80但我用GetWindowText取两EDIT的内容,发现是"192.168.1.1" 和"80",这说明数据已放入EDIT,只是还没有更新因此,想请高手出手,如需代码,请给我发消息

解决方案 »

  1.   

    信 誉 值:  11  ?做木马做的啊?呵呵.
    那个QQ不能用SetWindowText的,你还是模拟键盘输入吧,它的显示是DrawText好像,它是位图的.
      

  2.   

    请看清楚题目:
    to aby7984(野马): 偷QQ是小菜一碟,你会又怎么样?
    to EnochShen(小疯子抢分了,拦我者重伤!) :你错了,可以用SetWindowText,只是这里还要做什么动作而已.
    to linxy2002(阿郎):可以用SetWindowText,下面做法能得到证明
    拦截"测试"按钮,加入
    SetWindowText(IpaddrEdit,"192.168.1.1");//IpaddrEdit为IP地址的EDIT窗口句柄
    SetWindowText(IPortEdit,"80");//IPortEdit为端口的EDIT窗口句柄
    可实现
      

  3.   

    这里并没有泄及到偷QQ的问题,为什么有人一看到"钩消息",就说是"做木马""偷QQ"之类,我们讨论技术问题!!!我想实现这样的目的,不是为做这些事,问题解决完后会给大家一个交代!
      

  4.   

    hWnd = ::FindWindow("#32770","QQ登陆");
    CString str = "192.168.0.1";
    HWND hbtnWnd = ::GetDlgItem(hWnd,0x3e9);   //假设0x3e9是你要增的EDIT框

    ::SendMessage(hbtnWnd,WM_SETTEXT,0,(LPARAM)str.GetBuffer(str.GetLength()));
      

  5.   

    不可以的,SendMessage不行的
      

  6.   

    to wjl_2001(wjl_2001) ( ) 信誉:11 
    错的人不是我啊~~呵呵,SetWindowText当然可以,但是他不会显示,他是纪录你的键盘输入到一个变量,然后显示,你只改变显示的部分,不改变那个变量得值有用吗?最好的办法,是用在定位进入他程序的自身,然后修改,或者你了解他数据包的加密方式,截取后修改,不难得,上网上搜搜.
      

  7.   

    另外说一句,你不要以为可以SetWindowText他就是用SetWindowText类似的函数输入的,他是位图的,你用hook拦截WM_PAINT看看就知道了.呵呵~~~
      

  8.   

    奇怪的事发生了

    SetWindowText(IpaddrEdit,"192.168.1.1");//IpaddrEdit为IP地址的EDIT窗口句柄
    SetWindowText(IPortEdit,"80");//IPortEdit为端口的EDIT窗口句柄
    前加入
    ::MESSAGEBOX(null,"a","b",MB_OK);
    就可以了.
    怪,难道发给窗口的消息还没收到,或者是收到了还没来得及更新窗口????
      

  9.   

    果然是这样:当
    //发送CBN_SELCHANGE(这一步得到 hujun614(Softworm)大侠的指点)
    ::PostMessage((HWND)pMsg->lParam,WM_COMMAND,0x00013E81,(LONG)GetDlgItem((HWND)pMsg->lParam,0x00003E81));
    时,这一消息要刷新ip和port的内容,当你先
    SetWindowText(...)后,就比上面的消息清空了
    所以,在这两句之间要如果处理?Sleep()好象不太好,那要如何等待呢?
      

  10.   

    程序终于完成,原因主要是我的问题,大多数情况下我用PostMessage代替了SendMessage,这样在一些消息未处理时就接着Post另一消息,所以才难以完成上面的问题!其实想起来较简单,但做起来不容易!谢谢大家的参与!!!因朋友的网吧要用代理上QQ,但不可能叫每一个客户都填代理,这样让程序帮他完成这项工作!这就是我要实现此目的的原因!!!