鱼C论坛

 找回密码
 立即注册
查看: 3253|回复: 3

[原创] 屏幕截图程序(纯SDK)~~开源

[复制链接]
发表于 2015-3-7 10:24:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 迷雾少年 于 2015-3-8 08:54 编辑

大家好~~又见面了~~这次做个小小的东西~~送大家~~当然开塬~~一向都是
国际惯例~~给2张图

                               
登录/注册后可看大图


                               
登录/注册后可看大图


按 Ctrl + E  可以截图   还保存到C:\1.BMP


求顶~~~

下面是源码~~因为我是从VS的向导创建的WIN32  所以不 太干净

我用的是中文变量名~~~~VC6的直接  替换掉就OK了 ~~应该不是大问题~~

~~代码~~回复可见~~
防伸手~~
  1. [hide]
  2. <BLOCKQUOTE>#include "stdafx.h"              //注意这个 自己加头文件
  3. #include "Win32Project1.h" //注意
  4. #define MAX_LOADSTRING 1024
  5. // 全局变量:
  6. HINSTANCE hInst; // 当前实例
  7. TCHAR szTitle[256]; // 标题栏文本
  8. TCHAR szWindowClass[256]; // 主窗口类名

  9. // 此代码模块中包含的函数的前向声明:
  10. ATOM MyRegisterClass(HINSTANCE hInstance);
  11. BOOL InitInstance(HINSTANCE, int);
  12. LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
  13. void 窗口_创建完毕(HWND 窗口句柄);
  14. void 窗口_开始截图(HWND 窗口句柄);
  15. int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
  16. _In_opt_ HINSTANCE hPrevInstance,
  17. _In_ LPTSTR lpCmdLine,
  18. _In_ int nCmdShow)
  19. {
  20. UNREFERENCED_PARAMETER(hPrevInstance);
  21. UNREFERENCED_PARAMETER(lpCmdLine);

  22. // TODO: 在此放置代码。
  23. MSG msg;
  24. //HACCEL hAccelTable;

  25. // 初始化全局字符串
  26. LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
  27. LoadString(hInstance, IDC_WIN32PROJECT1, szWindowClass, MAX_LOADSTRING);
  28. MyRegisterClass(hInstance);

  29. // 执行应用程序初始化:
  30. if (!InitInstance (hInstance, nCmdShow))
  31. {
  32. return FALSE;
  33. }

  34. // = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32PROJECT1));

  35. // 主消息循环:
  36. while (GetMessage(&msg, NULL, 0, 0))
  37. {
  38. //if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
  39. // {
  40. TranslateMessage(&msg);
  41. DispatchMessage(&msg);
  42. // }
  43. }

  44. return (int) msg.wParam;
  45. }
  46. //
  47. // 函数: MyRegisterClass()
  48. //
  49. // 目的: 注册窗口类。
  50. //
  51. ATOM MyRegisterClass(HINSTANCE hInstance)
  52. {
  53. WNDCLASSEX wcex;

  54. wcex.cbSize = sizeof(WNDCLASSEX);

  55. wcex.style = CS_HREDRAW | CS_VREDRAW;
  56. wcex.lpfnWndProc = WndProc;
  57. wcex.cbClsExtra = 0;
  58. wcex.cbWndExtra = 0;
  59. wcex.hInstance = hInstance;
  60. wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT1));
  61. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  62. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
  63. wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WIN32PROJECT1);
  64. wcex.lpszClassName = szWindowClass;
  65. wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

  66. return RegisterClassEx(&wcex);
  67. }


  68. BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
  69. {
  70. HWND hWnd;

  71. hInst = hInstance; // 将实例句柄存储在全局变量中

  72. hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
  73. CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

  74. if (!hWnd)
  75. {
  76. return FALSE;
  77. }

  78. ShowWindow(hWnd, nCmdShow);
  79. UpdateWindow(hWnd);

  80. return TRUE;
  81. }

  82. //
  83. // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  84. //
  85. // 目的: 处理主窗口的消息。
  86. //
  87. // WM_COMMAND - 处理应用程序菜单
  88. // WM_PAINT - 绘制主窗口
  89. // WM_DESTROY - 发送退出消息并返回
  90. //
  91. //
  92. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  93. {
  94. int wmId, wmEvent;
  95. PAINTSTRUCT ps;
  96. HDC hdc;
  97. char szString[] = "按下Ctrl + E 截图";
  98. switch (message)
  99. {
  100. case WM_CREATE:
  101. {
  102. 窗口_创建完毕(hWnd);
  103. break;
  104. }
  105. case 257:
  106. {
  107. if(69==wParam)
  108. {

  109. 窗口_开始截图(hWnd);
  110. }

  111. break;
  112. }

  113. case WM_PAINT:
  114. hdc = BeginPaint(hWnd, &ps);
  115. // TODO: 在此添加任意绘图代码...
  116. TextOutA(ps.hdc,100,100,szString,lstrlenA(szString));
  117. EndPaint(hWnd, &ps);
  118. break;
  119. case WM_DESTROY:
  120. PostQuitMessage(0);
  121. break;
  122. default:
  123. return DefWindowProc(hWnd, message, wParam, lParam);
  124. }
  125. return 0;
  126. }

  127. //当窗口创建完毕 !会调用这个函数
  128. void 窗口_创建完毕(HWND 窗口句柄)
  129. {
  130. MessageBoxA(NULL,NULL,NULL,NULL);
  131. //设置热键
  132. SendMessageA(窗口句柄,WM_SETHOTKEY,581,0);
  133. }
  134. void 窗口_开始截图(HWND hWnd)
  135. {

  136. //MessageBoxA(NULL,NULL,NULL,NULL);
  137. /* 代码有点长 */
  138. HDC 图像_桌面DC = 0,图像_兼容DC = 0;
  139. HWND 窗口_桌面句柄 = 0;
  140. HBITMAP 位图_句柄 = 0;
  141. RECT 矩形_桌面 = {0},矩形_窗口 = {0};
  142. HDC 主窗口DC = GetDC(hWnd);

  143. /*隐藏!!如果想保存这个窗口的图!!可以判断最前台窗口句柄!!然后判断 */
  144. ShowWindow(hWnd,SW_HIDE);
  145. Sleep(300);
  146. 窗口_桌面句柄 = GetDesktopWindow();
  147. GetWindowRect(窗口_桌面句柄,&矩形_桌面);
  148. 图像_桌面DC = GetDC(窗口_桌面句柄);
  149. 位图_句柄 = CreateCompatibleBitmap(图像_桌面DC,矩形_桌面.right,矩形_桌面.bottom);
  150. 图像_兼容DC = CreateCompatibleDC(图像_桌面DC); // 创建兼容的内存DC
  151. SelectObject(图像_兼容DC,位图_句柄);
  152. BitBlt(图像_兼容DC,0,0,矩形_桌面.right,矩形_桌面.bottom,图像_桌面DC,0,0,SRCCOPY);

  153. BITMAP 位图 = {0};
  154. GetObject(位图_句柄,sizeof(BITMAP),&位图);

  155. BITMAPFILEHEADER 位图文件头 = {0};
  156. BITMAPINFOHEADER 位图信息头 = {0};
  157. DWORD 位图数据大小 = 位图.bmWidth * 位图.bmHeight * 2; // 16位 = 8字节
  158. char *数据指针 = new char[位图数据大小];
  159. memset(数据指针,0,位图数据大小);

  160. //填充文件头
  161. 位图文件头.bfType = 0x4D42; //'BM' 必须是 没有为什么
  162. 位图文件头.bfSize = 位图数据大小 + 54;
  163. 位图文件头.bfReserved1 = 0; //保留 没有为什么
  164. 位图文件头.bfReserved2 = 0; //同上
  165. 位图文件头.bfOffBits = 54;
  166. //填充信息头
  167. 位图信息头.biSize = 40; //本结构大小 直接sizeof
  168. 位图信息头.biHeight = 位图.bmHeight;
  169. 位图信息头.biWidth = 位图.bmWidth;
  170. 位图信息头.biPlanes = 1; //必须是1 没有理由
  171. 位图信息头.biBitCount = 16; //32真彩高清
  172. 位图信息头.biCompression = BI_RGB;
  173. 位图信息头.biSizeImage = 位图数据大小; // = 位图数据大小
  174. 位图信息头.biXPelsPerMeter = 0;
  175. 位图信息头.biYPelsPerMeter = 0;
  176. 位图信息头.biClrUsed = 0;
  177. 位图信息头.biClrImportant= 0;
  178. GetDIBits(图像_桌面DC,位图_句柄,0,位图.bmHeight,数据指针,(LPBITMAPINFO)&位图信息头,DIB_RGB_COLORS);

  179. DWORD Error = GetLastError();
  180. DWORD dwSize=0;
  181. HANDLE hFile=CreateFileA("C:\\1.BMP",GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
  182. FILE_ATTRIBUTE_NORMAL,0);//创建文件
  183. WriteFile(hFile,(void *)&位图文件头,sizeof(BITMAPFILEHEADER),&dwSize,0);//写入位图文件头
  184. WriteFile(hFile,(void *)&位图信息头,sizeof(BITMAPINFOHEADER),&dwSize,0);//写入位图信息头
  185. WriteFile(hFile,(void *)数据指针,位图数据大小,&dwSize,0);//写入位图数据
  186. CloseHandle((HANDLE)hFile);
  187. /* 再给主窗口一个 */
  188. //缩放
  189. GetWindowRect(hWnd,&矩形_窗口);
  190. ShowWindow(hWnd,SW_SHOW);
  191. //BitBlt(主窗口DC,0,0,矩形_窗口.bottom-矩形_窗口.top,1260,图像_兼容DC,0,0,SRCCOPY);
  192. StretchBlt(主窗口DC,0,0,矩形_窗口.right-矩形_窗口.left,矩形_窗口.bottom-矩形_窗口.top,图像_兼容DC,0,0,矩形_窗口.right-矩形_窗口.left,矩形_窗口.bottom-矩形_窗口.top,SRCCOPY);
  193. ReleaseDC(hWnd,主窗口DC);

  194. }
复制代码





评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +2 收起 理由
拈花小仙 + 5 + 5 + 2 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-7 10:30:59 | 显示全部楼层
先自顶~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-7 10:41:15 | 显示全部楼层
求顶~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-3-8 08:54:13 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 17:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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