📄 apilist.asm
字号:
;2002-12-21完成
;ver 1.02 修正版
;使用ApiIn转换程序,这样list.ifo中的垃圾大大减少
;把VC函数原型改为BC函数原型,这样大部分函数可以显示IN或OUT
;例:
;WINGDIAPI BOOL WINAPI GetWindowExtEx( IN HDC, OUT LPSIZE);
; ^^ ^^^
;IN就是输入,OUT就是输出
;Not.inc里面的函数在VC、BC、MSDN中找不到函数原型可能在VC.NET,如果谁有,请帮我加入,谢谢!
;我买了一套英文6张碟,装不上,好像是FrontePage不能更新?
;希望大家多提意见cgb123@21cn.com
;小技巧用户可以自己添加函数或常数,比如addr添加说明
;在windows.inc添加一行"addr MASM特有的 invoke专用"
;以后输入addr加空格就可显示"addr MASM特有的 invoke专用"
;文件说明
;ApiList.asm 主程序源码
;ApiList.exe 主程序
;list.txt 自动完成数据库(从AoGo的Masm for EditPlus提取)
;list.ifo 函数原型库(从BC5.5的\include提取)
;windows.inc 数据类型、常数库(从Masm7.0提取修改过)
;readme.txt 说明文件
;data.tmp 数据类型记忆库
;Not.inc 还没有找到函数原型的函数(如果谁有VS.NET,请帮我加入,谢谢!)
;使用方法:
;按CTRL+ALT显示或隐藏本程序,按ALT+UP或ALT+DOWN选择函数
;输入函数按空格即可自动完成和提示
;(比如输入GetWi按空格就会在IDE里显示GetWindow,下面编辑框里会显示提示
;输入数据类型后下次再查看类型按'.'
;(如先输入LV_ITEM,中间可以输入各种函数,下次输入(如果变量是lv)lv.)就会显示数据类型
;多级输入(如:你已经输入了 NMHDR、LV_COLUMN,输入'..'就可以跳到NMHDR
;还有类型的提示
; (比如输入NOTIFYICONDATA可以显示
; NOTIFYICONDATAA STRUCT
; cbSize DWORD ?
; hwnd DWORD ?
; uID DWORD ?
; uFlags DWORD ?
; uCallbackMessage DWORD ?
; hIcon DWORD ?
; szTip BYTE 64 dup (?)
; NOTIFYICONDATAA ENDS
;本程序已经被收录在www.AoGoSoft.com的软件发布、www.pediy.com的相关工具的编译工具里、华军软件园编程工具
;如果有你们新的函数或程序修改加入请你们通知我的邮箱cgb123@21cn.com或AoGoSoft.com网站的留言
;本程序现在是用HOOK不能直接读取编辑器里的内容,如果有自己的编辑器或加入NotePad中的插件,那将有可能比VC还好用
;小技巧函数GetWindow它的常数是GW_,SetWindowPos它的常数是SWP_
; ^ ^ ^ ^ ^
;它们都是取函数的大写字母
;窗口风格ListBox是LBS_,Edit是ES_,Windows是WS_,都是在后面加个S(Style)
;其它的雷同
.386
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include \masm32\include\windows.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\comctl32.inc
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\comctl32.lib
; #########################################################################
;WM_KEYBOARDHOOK equ WM_APP + 18
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
HookProc proto :DWORD,:DWORD,:DWORD
GetApi proto
.data
szDisplayName db "ApiList",0
szClassName db "ListBox",0
szEditName db "Edit",0
ApiFile db "list.txt",0
ApiIfo db "list.ifo",0
TempData db "data.tmp",0
WinDat db "Windows.inc",0
simsun db "宋体",0
.data?
ScreenSize SIZEL <?>
lpfnWndProc dd ?
hInstance dd ?
CommandLine dd ?
hWnd dd ?
m_Edit HWND ?
structends db 4096 dup (?)
ApiReset db 4096 dup (?)
ItemBuffer db 270 dup (?)
nfile dd ?
br dd ?
nfor dd ?
po POINT <?>
hHook dd ?
nFont dd ?
szAscii db 32 dup (?)
IsHook dd ?
strfor dd ?
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
; #########################################################################
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
LOCAL msg:MSG
invoke CreateFont,12,0,0,0,0,FALSE,FALSE,FALSE,DEFAULT_CHARSET,DEFAULT_QUALITY,DEFAULT_QUALITY,DEFAULT_QUALITY,FIXED_PITCH + FF_SWISS,addr simsun
mov nFont,eax
invoke CreateWindowEx,WS_EX_TOPMOST,
ADDR szEditName,
ADDR szDisplayName,
ES_READONLY + ES_WANTRETURN + ES_MULTILINE + WS_POPUP \
+WS_BORDER + ES_AUTOVSCROLL+ES_AUTOHSCROLL,
0,150,800,0,
NULL,NULL,
hInst,NULL
mov m_Edit,eax
invoke CreateWindowEx,WS_EX_TOPMOST,
ADDR szClassName,
ADDR szDisplayName,WS_POPUP+WS_BORDER+LBS_NOSEL+WS_VSCROLL,
0,0,300,150,
m_Edit,NULL,
hInst,NULL
mov hWnd,eax
invoke SetWindowLong,hWnd,GWL_WNDPROC,ADDR WndProc
mov lpfnWndProc, eax
invoke SendMessage,hWnd,WM_SETFONT,nFont,0
invoke SendMessage,hWnd,LB_INITSTORAGE,30000,500000
invoke SendMessage,m_Edit,WM_SETFONT,nFont,0
invoke ShowWindow,m_Edit,SW_SHOWNOACTIVATE
mov br,4
invoke SendMessage,m_Edit,EM_SETTABSTOPS,1,addr br
invoke CreateFile,addr TempData,GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL
invoke CloseHandle,eax
invoke CreateFile,ADDR ApiFile,080000000h,03,
0,03,80,NULL
mov nfile,eax
push edi
.while eax != -1
invoke ReadFile,nfile,addr ItemBuffer,128,addr br,NULL
cmp br,128
jnz FileEnd
lea edi,ItemBuffer
mov ecx,br
mov al,0dh
repne scasb
dec edi
mov BYTE ptr [edi],0
sub ecx,br
not ecx
inc ecx
inc ecx
add nfor,ecx
invoke SetFilePointer,nfile,nfor,NULL,FILE_BEGIN
.if br != 0
invoke SendMessage,hWnd,LB_ADDSTRING,0,ADDR ItemBuffer
.else
mov eax,-1
.endif
.endw
FileEnd:
pop edi
invoke CloseHandle,nfile
; --------------------------------------------------------
invoke GetSystemMetrics,SM_CXFULLSCREEN
mov ScreenSize.x,eax
invoke GetSystemMetrics,SM_CYFULLSCREEN
shr eax,1
mov ScreenSize.y,eax
invoke ShowWindow,hWnd,SW_SHOWNOACTIVATE
invoke ShowWindow,hWnd,SW_HIDE
invoke UpdateWindow,hWnd
mov nfor,0
invoke SetWindowsHookEx,WH_JOURNALRECORD,addr HookProc,hInstance,NULL
mov hHook,eax
mov IsHook,TRUE
mov BYTE ptr ItemBuffer,0
invoke SetTimer,hWnd,1,50,NULL
;===================================
; Loop until PostQuitMessage is sent
;===================================
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
mov eax,msg.wParam
ret
WinMain endp
; #########################################################################
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
.if uMsg == WM_CLOSE
.elseif uMsg == WM_DESTROY
invoke DeleteObject,nFont
invoke PostQuitMessage,NULL
invoke UnhookWindowsHookEx,hHook
xor eax,eax
ret
.elseif uMsg == WM_LBUTTONUP
invoke SendMessage,hWin,LB_GETCURSEL,0,0
invoke SendMessage,hWin,LB_GETTEXT,eax,addr ItemBuffer+128
call GetApi
mov nfor,0
invoke SendMessage,m_Edit,EM_GETLINECOUNT,0,0
push eax
xor ecx,ecx
xor ebx,ebx
.while ecx != [esp]
push ecx
mov WORD ptr ItemBuffer+128,128
invoke SendMessage,m_Edit,EM_GETLINE,ecx,addr ItemBuffer+128
.if ebx < eax
mov ebx,eax
.endif
pop ecx
inc ecx
.endw
pop eax
imul ebx,ebx,6
add ebx,4
imul eax,eax,14
.if po.y > 300
sub po.y,eax
.else
add po.y,24
.endif
invoke MoveWindow,m_Edit,5,po.y,ebx,eax,TRUE
.elseif uMsg == WM_RBUTTONUP
invoke SendMessage,hWin,WM_DESTROY,0,0
.elseif uMsg == WM_TIMER
invoke GetAsyncKeyState,VK_MENU
push eax
invoke GetAsyncKeyState,VK_CONTROL
pop ebx
.if eax >2 && ebx>2
.while eax != 0
invoke GetAsyncKeyState,VK_CONTROL
.endw
.if IsHook != 0
invoke UnhookWindowsHookEx,hHook
invoke ShowWindow,hWin,SW_HIDE
invoke ShowWindow,m_Edit,SW_HIDE
mov nfor,-1
mov IsHook,0
.else
invoke SetWindowsHookEx,WH_JOURNALRECORD,addr HookProc,hInstance,NULL
mov hHook,eax
invoke ShowWindow,hWin,SW_SHOWNOACTIVATE
invoke ShowWindow,m_Edit,SW_SHOWNOACTIVATE
mov nfor,0
mov BYTE ptr ItemBuffer,0
mov IsHook,TRUE
.endif
.endif
invoke GetAsyncKeyState,VK_MENU
.if eax >2
invoke GetAsyncKeyState,VK_UP
push eax
invoke GetAsyncKeyState,VK_DOWN
pop ebx
.if eax >2 || ebx >2
invoke SendMessage,hWnd,LB_GETTOPINDEX,0,0
.if ebx > 2
dec eax
.else
inc eax
.endif
invoke SendMessage,hWnd,LB_SETTOPINDEX,eax,0
.endif
invoke GetAsyncKeyState,VK_PGUP
PUSH eax
invoke GetAsyncKeyState,VK_PGDN
pop ebx
.if eax >2 || ebx >2
invoke SendMessage,hWnd,LB_GETTOPINDEX,0,0
.IF EBX>2
SUB eax,10
.ELSE
ADD eax,10
.ENDIF
invoke SendMessage,hWnd,LB_SETTOPINDEX,eax,0
.endif
ret
.endif
.endif
invoke CallWindowProc,lpfnWndProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
HookProc proc _dwCode,_wParam,_lParam
local @szKeyState[256]:byte
invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam
pushad
.if _dwCode == HC_ACTION && nfor != -1
mov ebx,_lParam
assume ebx:ptr EVENTMSG
.if [ebx].message == WM_KEYDOWN
invoke GetCaretPos,ADDR po
invoke GetFocus
invoke ClientToScreen,eax,ADDR po
invoke GetKeyboardState,addr @szKeyState
invoke GetKeyState,VK_SHIFT
mov @szKeyState + VK_SHIFT,al
mov ecx,[ebx].paramH
shr ecx,16
invoke ToAscii,[ebx].paramL,ecx,addr @szKeyState,addr szAscii,0
mov byte ptr szAscii [eax],0
mov al,BYTE ptr szAscii
.if al == 20h
lea esi,ItemBuffer
INVOKE SendMessage,hWnd,LB_GETTOPINDEX,0,0
.if eax == 0
mov nfor,0
jmp @ret
.endif
INVOKE SendMessage,hWnd,LB_GETTEXT,eax,addr ItemBuffer+128
push eax
invoke lstrcmp,addr ItemBuffer,addr ItemBuffer+128
pop ecx
push eax
push ecx
.if eax == 0
mov WORD ptr ItemBuffer+128[ecx],020h
.endif
.if nfor == 0
mov nfor,0
mov BYTE ptr ItemBuffer,0
jmp @ret
.endif
xor eax,eax
inc eax
.while al != 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -