想实现这样的目标:
QQ2004_2版中登录界面有一个"网络设置"的按钮,点击后会有一个展开的对话框,在里面有个"类型",可以选取"不使用代理""SOCKS5代理""HTTP代理""使用浏览器设置",默认情况下是第一个, 现在我想通过拦截消息,实现当用户按下"登录"按钮时,自动选取"HTTP代理",并填上相应的地址和端口,于是我这样做if( (pMsg->message==0x00000001||pMsg->message==0x00003e88||pMsg->message==0x00000069)&&(pMsg->wParam)==WM_COMMAND)//消息号0X00000001为"登录"按钮的ID,0X00003e88为"网络设置"按钮的ID,0X000069为"申请QQ"的ID
.....判断是不是QQ登录窗口.....如是:
//让"网络设置"对话框显示
::PostMessage((HWND)pMsg->lParam,WM_COMMAND,0x00003E88,LONG(GetDlgItem((HWND)pMsg->lParam,0x00003E88)));//选中类型的"HTTP代理"
::PostMessage(GetDlgItem((HWND)pMsg->lParam,0x00003E81),CB_SETCURSEL,2,NULL);//这一步实现了HWND IpaddrEdit=GetDlgItem((HWND)pMsg->lParam,0x00003E82);//得到ip地址窗口句柄
HWND IPortEdit=GetDlgItem((HWND)pMsg->lParam,0x00003E84);//得到端口窗口句柄
接下来的这二步不管怎么弄,就是不能填
SetWindowText(IpaddrEdit,"192.168.1.1");//SetDlgItemText((HWND)pMsg->lParam,0x3E82,,"192.168.1.1");
SetWindowText(IPortEdit,"80");于是在此两句前加上一堆spy++侦测到的消息
::PostMessage(IpaddrEdit, WM_SETFOCUS, 0,0);
::PostMessage(IpaddrEdit, WM_ENABLE, 1,0);如果我们是用鼠标来选"HTTP代理"的话,会使IpaddrEdit和IPortEdit变得可写啊,那我这样做怎么不行?
请高手指点我该如何实现??? 

解决方案 »

  1.   

    发送消息:IPM_SETADDRESS来进行设置
      

  2.   

    不是吧,他的控件并不是IPADDRESS啊
      

  3.   

    跨进程了,对于基本控件,WINDOWS已经为你通过文件映射实现了编排与解编,对于IPAddress,ListCtrl之类的则需要通过IPC机制,或者通过远程注入等方式解决。
      

  4.   

    我是用全局DLL啊,这样应该可以的啊,下面的实验得到证实:
    当你的QQ用HTTP代理后,那么下一次登录可以通过上面的代理实现IP的转变,如你上一次是192.168.1.1:80,现在想改为192.168.1.2:1080,上面的代码可以实现,但如果上次没有用代理,那么就不行!!
    别外,上面的IP地址不是ipaddress格式,是一般的EDIT!!
      

  5.   

    我感觉你应该注意一下这个问题。
    QQ改窗口属性会通过CBN_SELCHANGE事件,
    所以你应该再发一个CBN_SELCHANGE消息,详见MSDN
    CBN_SELCHANGE Notification--------------------------------------------------------------------------------The CBN_SELCHANGE notification message is sent when the user changes the current selection in the list box of a combo box. The user can change the selection by clicking in the list box or by using the arrow keys. The parent window of the combo box receives this notification in the form of a WM_COMMAND message with CBN_SELCHANGE in the high-order word of the wParam parameter. SyntaxCBN_SELCHANGE    WPARAM wParam
        LPARAM lParam;
        
    ParameterswParam
    The low-order word specifies the control identifier of the combo box. 
    The high-order word specifies the notification message. lParam
    Handle to the combo box. 
    Return ValueNo return value.
    ResTo get the index of the current selection, send the CB_GETCURSEL message to the control.The CBN_SELCHANGE notification message is not sent when the current selection is set using the CB_SETCURSEL message. Notification RequirementsMinimum DLL Version None 
    Header Declared in Winuser.h, include Windows.h 
    Minimum operating systems Windows 95, Windows NT 3.1 See Also
      

  6.   

    朋友,看看我这样对不对:3e81为控件的ID,0001为CBN_SELCHANGE的消息号
    WPARAM msg=0x00013E81;::PostMessage(GetDlgItem((HWND)pMsg->lParam,0x00003E81),WM_COMMAND,msg,LONG(GetDlgItem((HWND)pMsg->lParam,0x00003E81)));
      

  7.   

    大哥,快成功了,lParam这个参数不知道是什么,用控件的句柄试了一下不对啊,是什么???
      

  8.   

    lParam这个参数摸不着头脑,好象不是控件的窗口句柄啊
      

  9.   

    Handle to the combo box. 
    Return Value
    下拉框的句柄啊!
      

  10.   

    为什么不发给控件所在窗口,而要发给控件呢?
    GetDlgItem((HWND)pMsg->lParam,0x00003E81)
    发给(HWND)pMsg->lParam不是很好的主意吗?
      

  11.   

    我换用向控件所在窗口发消息了,成功,接下来的问题
    SetWindowText(IpaddrEdit,"192.168.1.1");.....不成功.....是不是又得发EN_CHANGE给控件所在窗口?在此之前发还是之后发?
      

  12.   

    连续好了几个控制消息,包括EN_CHANGE,都不行
      

  13.   

    连续好了几个控制消息,包括EN_CHANGE,EN_UPDATE,EN_SETFOCUS都不行
      

  14.   

    调试之后,发现能赋值(通过GetWindowText检查),但赋值后要发什么消息给主窗口,让主窗口知道并更新数据呢?还请高手再帮帮忙!!!
      

  15.   

    关于控件的ID,是个数字而已,打开资源看就是了,只不过我们在程序中通常用助记符。
    有了控件ID还不能知道其它的吗。GetDlgItem。
      

  16.   

    接下来的这二步不管怎么弄,就是不能填
    SetWindowText(IpaddrEdit,"192.168.1.1");//SetDlgItemText((HWND)pMsg->lParam,0x3E82,,"192.168.1.1");
    SetWindowText(IPortEdit,"80");
    ------------------------------------------------
    改成SendMessage(WM_SETTEXT,...)试试,
      

  17.   

    是可以填的,我弄错了
     因为我填后用GetWindowText得到填得正确,但这时该EDIT并没有更新数据,我该发送什么消息啊
    如何让主窗口知道EDIT已改变并更新数据呢?还请高手再帮帮忙!!!
      

  18.   

    你干脆给它发按键消息好了。WM_CHAR
      

  19.   

    我无聊!!!!!!!!!!!!!!!!跟开头一样的道理。更新后再发个EN_CHANGE消息
      

  20.   

    极度不平衡,为什么QQ是这样的,我模拟了一个combo 和 两个edit,效果跟QQ里的一样,在我的模拟程序里,完成
    SetWindowText(IpaddrEdit,"192.168.1.1");
    SetWindowText(IPortEdit,"80");
    并没出现什么问题,也不需发送EN_CHANGE,请极度高手解决,送500分加此100分共600百分