飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 8048|回复: 21

用汇编语言写QQ任我聊

[复制链接]

该用户从未签到

发表于 2006-8-28 17:52:47 | 显示全部楼层 |阅读模式
[注意]原创,转载请注明!!!
呵呵!一个小工具而已,就是没加为好友也可以和别人聊天,临时会话!跟群里的和网站上的那种原理是一样的!

原理解析:
在Tencent的互动服务里面(http://imis.qq.com/)可以为你生成网页代码放到自己的网页中,让别人在网站上点一下就可以给你留言!
程序就是利用的这个生成的代码,直接在浏览器中输入
tencent://message/?uin=你想聊天的QQ号码&Site=im.qq.com&Menu=yes

就可以和别人聊天了,取消临时会话的用户不行(这个就是临时会话嘛!)
下面是汇编程序源代码:

.386
.model flat,stdcall  
option casemap:none  
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\masm32.inc
include \masm32\include\shell32.inc

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\shell32.lib
.data?
QQnum db ?
hInstance HINSTANCE ?
swidth  dd ?
sheight dd ?
dwidth  dd ?      
dheight dd ?
rect    RECT <>
mystr db ?
szTemp1 db ?
szTemp2 db ?
.data
str1 db "tencent://message/?uin=",0
str2 db "&Site=im.qq.com&Menu=yes",0
MainDialog db "MyDialog",0
szMutex db "zhangkesqqtalker",0
ErrorText db "Program already run...",0
ErrorTitle db "Warning!!!",0

.const
BTNSTART equ 1003
EDITNUM  equ 1002
.code

start:

Main proc
    invoke GetModuleHandle,NULL
    mov hInstance,eax
    invoke DialogBoxParam,hInstance,addr MainDialog,NULL,addr DlgProc,NULL
    invoke ExitProcess,0
Main endp
DlgProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    .if uMsg==WM_INITDIALOG
        invoke CreateMutex,NULL,FALSE,addr szMutex
        invoke GetLastError
        .IF eax == ERROR_ALREADY_EXISTS
            invoke MessageBox,NULL,addr ErrorText,addr ErrorTitle,MB_ICONWARNING
            invoke ExitProcess,NULL
        .ENDIF
        ;上面几行代码的作用的防止程序多开(即只能运行一个实例)
        invoke GetSystemMetrics,SM_CXSCREEN     ;
        mov swidth,eax                          ;
        invoke GetSystemMetrics,SM_CYSCREEN     ;
        mov sheight,eax                         ;
        invoke GetWindowRect,hWnd,addr rect     ;
        mov eax,rect.right                      ;这几行是为下面invoke SetWindowPos做准备
        sub eax,rect.left                       ;
        mov dwidth,eax                          ;
        sub swidth,eax                          ;使窗体出现在屏幕中心
        mov eax,rect.bottom                     ;
        sub eax,rect.top                        ;
        mov dheight,eax                         ;其中不明白的地方看一下Platform SDK就可以了
        sub sheight,eax                         ;
        shr sheight,1                           ;
        shr swidth,1                            ;
        invoke SetWindowPos,hWnd,HWND_NOTOPMOST,swidth,sheight,dwidth,dheight,SWP_SHOWWINDOW
    .elseif uMsg==WM_COMMAND
        mov eax,wParam
          .if ax==BTNSTART
            invoke szCopy,addr str1,addr mystr
              invoke GetDlgItemText,hWnd,EDITNUM,addr QQnum,11
            invoke szCatStr,addr mystr,addr QQnum
              invoke szCatStr,addr mystr,addr str2
              invoke ShellExecute,NULL,NULL,addr mystr,NULL,NULL,SW_HIDE
        .endif
    .elseif uMsg==WM_CLOSE
        invoke EndDialog,hWnd,0
    .else
        mov eax,FALSE
          ret
    .endif
    mov eax,TRUE
    ret
DlgProc endp

end start

忘了说!补充一句,使用工具为MASM32!!!

有任何问题请与我联系:[email protected]

程序截图

程序截图
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-8-28 20:03:01 | 显示全部楼层
晕!
关键的东西忘了发

QQ任我聊.rar

4.7 KB, 下载次数: 32, 下载积分: 飘云币 -2 枚

代码及程序

PYG19周年生日快乐!

该用户从未签到

发表于 2006-8-28 21:31:57 | 显示全部楼层
内部调用IE,SHELLEXCUTE是关键部分。

[ 本帖最后由 caterpilla 于 2006-8-28 21:34 编辑 ]
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-8-29 18:09:07 | 显示全部楼层
呵呵!
原理才是关键,不知道原理的话......
PYG19周年生日快乐!

该用户从未签到

发表于 2006-8-31 15:08:15 | 显示全部楼层
呵呵,原哩是非常简单的

tencent://message/?uin=你想聊天的QQ号码&Site=im.qq.com&Menu=yes

不过楼主的代码有个BUG哦,就是窗口没有图标哦

在DlgProc 的WM_INITDIALOG事件里加入下面2句代码可解决问题:

invoke LoadIcon,hInstance,1008
       
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax    ;设置窗口图标

[ 本帖最后由 hacker0058 于 2006-8-31 15:19 编辑 ]
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-9-1 18:16:42 | 显示全部楼层
呵呵,这不能算bug吧,开始我程序也没准备弄图标的~
不过还是谢谢你了,我此前确实没研究过API方式如何设置窗体的图标
PYG19周年生日快乐!
秋风下的落叶 该用户已被删除
发表于 2006-9-3 18:53:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2006-9-4 10:01:45 | 显示全部楼层
是的,Masm32
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-1-15 11:40
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2006-9-6 14:43:19 | 显示全部楼层
    高手。。汗。。还不会汇编~
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2006-9-11 16:27:17 | 显示全部楼层
    我搞个精简版以提高初学者对汇编的兴趣

    =========================


    .486
    .model flat,stdcall
    option casemap:none

    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ;        Include 数据
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    include windows.inc
    include kernel32.inc
    include shell32.inc
    includelib kernel32.lib
    include user32.inc
    includelib user32.lib
    includelib shell32.lib

    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
    ;        Equ 数据 RC资源
    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


    DLG_MAIN        equ                1000
    IDC_EDT         equ             1001
    IDC_IDOK        equ             1002
    QQ_N            equ             12            ;设置QQ号的最大位数

    ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

    .data

    temp db "tencent://message/?uin=",'%s',"&Site=im.qq.com&Menu=yes",0


    .data?
    posBuffer  db 50+QQ_N dup (?)
    qqtemp db QQ_N dup (?)
    hInstance HINSTANCE ?  

    .code

    ;********************************************************************
    _ProcDlgMain        proc        uses ebx edi esi, \
                    hWnd:DWORD,wMsg:DWORD,wParam:DWORD,lParam:DWORD

                mov eax,wMsg
       
                   cmp eax,WM_CLOSE
                je  boxClose
            cmp eax,WM_INITDIALOG
            je  boxStart
            cmp eax,WM_COMMAND
            je commoand
       
       retFalse:
               mov        eax,FALSE
               ret   
                     
       boxClose:
              invoke EndDialog,hWnd,NULL
              jmp retTrue
             
       boxStart:
             
                  invoke SetWindowPos,hWnd,HWND_TOPMOST,0,0,0,0, SWP_NOMOVE or SWP_NOSIZE ;窗口置顶
                  jmp retTrue
                      
       commoand:
               mov eax,wParam
           
              .if eax == IDC_IDOK
                              
                  invoke GetDlgItemText,hWnd,IDC_EDT ,addr qqtemp,QQ_N  ;取用户输入到文本
                                 
                  invoke wsprintf,addr posBuffer,addr temp,addr qqtemp ;连接文本串
                                   
                  invoke ShellExecute,NULL,NULL,addr posBuffer,NULL,NULL,SW_HIDE  ;执行IE命令
                                   
                  ;invoke MessageBox,NULL,addr posBuffer,addr qqtemp,MB_ICONWARNING ;调试

               .endif
                
         retTrue:
           
               mov        eax,TRUE
               ret       

    _ProcDlgMain        endp

    ;********************************************************************

    start:
      invoke GetModuleHandle,NULL
      mov hInstance,eax
      invoke DialogBoxParam,eax,DLG_MAIN,NULL,offset _ProcDlgMain,0
      invoke ExitProcess,NULL

    ;********************************************************************

    end        start
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表