用汇编语言写QQ任我聊
[注意]原创,转载请注明!!!呵呵!一个小工具而已,就是没加为好友也可以和别人聊天,临时会话!跟群里的和网站上的那种原理是一样的!
原理解析:
在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 ?
swidthdd ?
sheight dd ?
dwidthdd ?
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
EDITNUMequ 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] 晕!
关键的东西忘了发 内部调用IE,SHELLEXCUTE是关键部分。
[ 本帖最后由 caterpilla 于 2006-8-28 21:34 编辑 ] 呵呵!
原理才是关键,不知道原理的话...... 呵呵,原哩是非常简单的
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 编辑 ] 呵呵,这不能算bug吧,开始我程序也没准备弄图标的~
不过还是谢谢你了,我此前确实没研究过API方式如何设置窗体的图标 是的,Masm32 高手。。汗。。还不会汇编~ 我搞个精简版以提高初学者对汇编的兴趣
=========================
.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?
posBufferdb 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
jeboxClose
cmp eax,WM_INITDIALOG
jeboxStart
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