browser icon
You are using an insecure version of your web browser. Please update your browser!
Using an outdated browser makes your computer unsafe. For a safer, faster, more enjoyable user experience, please update your browser today or try a newer browser.

了无秘密

Posted by on 2006 年 03 月 08 日

你可以任意转载本文,但请在转载后的文章中注明作者和原始链接。
媒体约稿请联系 titilima_AT_163.com(把“_AT_”换成“@”)。

从网上看见一个小程序,可以更改 QQ 的性别。回想起来原来的 QQ 也是可以更改的,因为那个性别域是个带有 CBS_DROPDOWN 样式的 ComboBox ,而不是 CBS_DROPDOWNLIST 的样式。也就是说,QQ 数据库中的“性别”属性是简单的文本存储,而不是字典式存储。所以,即使现在的 QQ 将那个 ComboBox 改为了 CBS_DROPDOWNLIST 样式,也可以用外部的手段来切换性别。这个技术没什么好说的,无非是利用了查找窗口、发送消息的几个 API ,所以下面只列出代码,不明白为什么要那样用 FindWindow/FindWindowEx 的朋友可以去问 Spy++ 。

C++代码
  1. BOOL AddQQSex( LPCTSTR lpszSexNew )   
  2. {   
  3.     HWND hDlg = FindWindow( _T("#32770"), _T("QQ2006设置") );   
  4.     if ( NULL == hDlg )   
  5.     {   
  6.         return FALSE;   
  7.     }   
  8.     // 这儿又套了一层   
  9.     hDlg = FindWindowEx( hDlg, NULL, _T("#32770"), _T("QQ2006设置") );   
  10.     if ( NULL == hDlg )   
  11.     {   
  12.         return FALSE;   
  13.     }   
  14.     // 开始循环查找目标页面   
  15.     HWND hPage;   
  16.     for ( hPage = FindWindowEx( hDlg, NULL, _T("#32770"), NULL ); NULL != hPage;   
  17.           hPage = FindWindowEx( hDlg, hPage, _T("#32770"), NULL ) )   
  18.     {   
  19.         HWND hStatic = GetDlgItem( hPage, 0x54b );   
  20.         if ( IsWindow( hStatic ) )   
  21.         {   
  22.             TCHAR strText[20];   
  23.             GetWindowText( hStatic, strText, 20 );   
  24.             if ( lstrcmp( strText, _T("性    别:") ) == 0 )   
  25.             {   
  26.                 break;   
  27.             }   
  28.         }   
  29.     }   
  30.     // 再判断一次看找到没   
  31.     if ( NULL == hPage )   
  32.     {   
  33.         return FALSE;   
  34.     }   
  35.     // 找到了就做处理   
  36.     HWND hcmbSex = GetDlgItem( hPage, 0x54c );   
  37.     // 保个险再   
  38.     if ( NULL == hcmbSex )   
  39.     {   
  40.         return FALSE;   
  41.     }   
  42.     int nIndex = SendMessage( hcmbSex, CB_ADDSTRING, 0, (LPARAM)lpszSexNew );   
  43.     if ( CB_ERR == nIndex || CB_ERRSPACE == nIndex )   
  44.     {   
  45.         return FALSE;   
  46.     }   
  47.     SendMessage( hcmbSex, CB_SETCURSEL, (WPARAM)nIndex, 0 );   
  48.     return TRUE;   
  49. }  

订阅本站

6 Comments

  • At 2006.03.09 10:12, etian said:

    看的云里雾里~!

    • At 2006.03.13 16:43, mayulei said:

      没新帖可以灌水。
      思路倒是清楚了……不过代码没看明白。
      难道从UI上的CBS_DROPDOWN或CBS_DROPDOWNLIST就可以判断QQ数据库中的“性别”属性文本存储、而不是字典式存储吗?
      这方面我是文盲,没用过,路过,顺便灌水。

      • At 2006.03.13 16:59, 李马 said:

        To mayulei:
        原来的QQ使用了CBS_DROPDOWN样式的ComboBox,性别那栏可以胡乱填写的,于是我就此判断这一属性乃文本存储。

        • At 2006.04.05 22:45, 明明 said:

          所谓的搏客们,请不要写知识们无聊的内容上去好吗?

          • At 2010.08.04 10:27, 蚂蚁 said:

            应该只是本地修改显示吧 其他QQ好友看见的是不会改变的

            • At 2010.08.04 13:30, 李马 said:

              [quote=蚂蚁]应该只是本地修改显示吧 其他QQ好友看见的是不会改变的[/quote]仔细看下博文的发表时间。

              (Required)
              (Required, will not be published)