分享
 
 
 

用MASM32编程截取屏幕

王朝other·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

; 功能: 把屏幕内容拷贝到剪贴板并显示在程序窗口上

; 作者: Purple Endurer

; 环境: Windows 2000 PRO + MASM32 V8

;

; 日志

; ---------------------

; 2005.12.24 创建!

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

.386

.model flat, stdcall

option casemap:none

include \masm32\include\windows.inc

include \masm32\include\gdi32.inc

include \masm32\include\kernel32.inc

include \masm32\include\user32.inc

includelib \masm32\lib\gdi32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\user32.lib

DlgProc PROTO :DWORD, :DWORD, :DWORD, :DWORD

CopyScreenToBitmap PROTO :DWORD

CopyBMPtoClipboard PROTO :HANDLE, :HWND

DrawBMP PROTO :HWND, :HANDLE

m_m2m MACRO d1, d2

push d2

pop d1

ENDM

IDD_dlgCopyScr equ 8000

IDC_btnCopyScr equ 1008

.data?

g_hInstance HINSTANCE ?

g_ScrRect RECT <>

.code

start:

invoke GetModuleHandle, NULL

mov g_hInstance, eax

;m_m2m g_ScrRect.top, 0

;m_m2m g_ScrRect.left, 0

;m_m2m g_ScrRect.bottom, 200

;m_m2m g_ScrRect.right, 100

invoke DialogBoxParam, g_hInstance, IDD_dlgCopyScr, NULL, OFFSET DlgProc, NULL

invoke ExitProcess, eax

DlgProc proc hWnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM

.IF uMsg == WM_CLOSE

invoke EndDialog, hWnd, NULL

;.ELSEIF uMsg == WM_INITDIALOG

.ELSEIF (uMsg == WM_COMMAND)

mov eax, wParam

mov edx, eax

shr edx, 16

.if (dx == BN_CLICKED) ;If button is clicked

.IF (eax == IDC_btnCopyScr)

invoke GetDesktopWindow

invoke GetWindowRect, eax, ADDR g_ScrRect

invoke CopyScreenToBitmap, ADDR g_ScrRect

push eax

invoke CopyBMPtoClipboard, eax, hWnd

pop eax

invoke DrawBMP, hWnd, eax

.ENDIF

.endif

.ELSE

mov eax, FALSE

ret

.ENDIF

mov eax, TRUE

ret

DlgProc endp

; lpRect 为指向要拷贝的屏幕区域的坐标结构的指针

CopyScreenToBitmap proc lpRect: DWORD

LOCAL hScrDC, hMemDC: HDC ;屏幕和内存设备描述表

LOCAL hBitmap, hOldBitmap: HBITMAP ;位图句柄

LOCAL nX, nY, nX2, nY2: DWORD ;选定区域坐标

LOCAL nWidth, nHeight: DWORD ;位图宽度和高度

LOCAL xScrn, yScrn: DWORD ;屏幕分辨率

;判断选定区域是否为空矩形

invoke IsRectEmpty, lpRect

or eax, eax

jz @F

;m_m2m eax, 1 ;是空矩形

ret

@@:

;为屏幕创建设备描述表

xor eax, eax

jz @F

szDisplay db "DISPLAY", 0

@@:

invoke CreateDC, ADDR szDisplay, NULL, NULL, NULL

cmp eax, NULL

jne @F

;m_m2m eax, 2 ;不能创建DC

ret

@@:

mov hScrDC, eax

;为屏幕设备描述表创建兼容的内存设备描述表

invoke CreateCompatibleDC, hScrDC

cmp eax, NULL

jne @F

;m_m2m eax, 3 ;不能创建兼容的内存设备描述表

ret

@@:

mov hMemDC, eax

;获得选定区域坐标

mov eax, lpRect

assume eax: ptr RECT

m_m2m nX, [eax].left

m_m2m nY, [eax].top

m_m2m nX2, [eax].right

m_m2m nY2, [eax].bottom

assume eax: nothing

;获得屏幕分辨率

invoke GetDeviceCaps, hScrDC, HORZRES

mov xScrn, eax

invoke GetDeviceCaps, hScrDC, VERTRES

mov yScrn, eax

;确保选定区域是可见的

.if (nX < 0)

m_m2m nX, 0

.endif

.if (nY < 0)

m_m2m nY, 0

.endif

mov eax, nX2

.if (eax > xScrn)

m_m2m nX2, xScrn

.endif

mov eax, nY2

.if (eax > yScrn)

m_m2m nY2, yScrn

.endif

mov eax, nX2

sub eax, nX

mov nWidth, eax

mov eax, nY2

sub eax, nY

mov nHeight, eax

;创建一个与屏幕设备描述表兼容的位图

invoke CreateCompatibleBitmap, hScrDC, nWidth, nHeight

cmp eax, NULL

jne @F

;m_m2m eax, 4 ;不能创建屏幕设备描述表兼容的位图

ret

@@:

mov hBitmap, eax

;把新位图选到内存设备描述表中

invoke SelectObject, hMemDC, hBitmap

cmp eax, NULL

jne @F

;m_m2m eax, 5 ;an error occurs and the selected object is not a region

ret

@@:

cmp eax, GDI_ERROR

jne @F

;m_m2m eax, 6

ret

@@:

mov hOldBitmap, eax

;把屏幕设备描述表拷贝到内存设备描述表中

invoke BitBlt, hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY

;得到屏幕位图的句柄

invoke SelectObject, hMemDC, hOldBitmap

push eax ;mov hBitmap, eax

;清除

invoke DeleteDC, hScrDC

invoke DeleteDC, hMemDC

;返回位图句柄

pop eax ;mov eax, hBitmap

ret

CopyScreenToBitmap endp

;得到屏幕位图句柄以后,我们可以把屏幕内容粘贴到剪贴板上

;hBitmap: 位图句柄

;hWnd: 程序窗口句柄

CopyBMPtoClipboard proc hBitmap: HANDLE, hWnd: HWND

invoke OpenClipboard, hWnd ;

or eax, eax

jnz @F

m_m2m eax, 1

ret

@@:

;清空剪贴板

invoke EmptyClipboard

or eax, eax

jnz @F

m_m2m eax, 2

ret

@@:

;把位图内容粘贴到剪贴板上

invoke SetClipboardData, CF_BITMAP, hBitmap

or eax, eax

jnz @F

m_m2m eax, 3

ret

@@:

;关闭剪贴板

invoke CloseClipboard

or eax, eax

jnz @F

m_m2m eax, 4

ret

@@:

xor eax, eax

ret

CopyBMPtoClipboard endp

;在指定窗口上绘制位图

DrawBMP proc hWnd: HWND, hBmp: HANDLE

LOCAL hDC: HDC

LOCAL hOld: DWORD

LOCAL memDC :DWORD

invoke GetDC, hWnd

mov hDC, eax

invoke CreateCompatibleDC, eax

mov memDC, eax

invoke SelectObject, memDC, hBmp

mov hOld, eax

invoke BitBlt, hDC, 120, 0, 1000, 1000, memDC, 0, 0, SRCCOPY

invoke SelectObject, hDC, hOld

invoke DeleteDC, memDC

invoke DeleteDC, hDC

;xor eax, eax

ret

DrawBMP endp

end start

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

;资源文件rsrc.rc

;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

#include "\masm32\include\resource.h"

#define IDD_dlgcopyScr 8000

#define IDC_btnCopyScr 1008

IDD_dlgcopyScr DIALOG 20, 20, 295, 165

STYLE 0x0004 | DS_CENTER | WS_CAPTION | DS_SYSMODAL | WS_SYSMENU | WS_MINIMIZEBOX

| WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK

CAPTION "拷贝屏幕"

{

PUSHBUTTON "&C 拷贝屏幕", IDC_btnCopyScr, 5, 5, 52, 52, WS_BORDER

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有