Advertisement
Guest User

Untitled

a guest
Dec 29th, 2020
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 6.00 KB | None | 0 0
  1. use std::ffi::CString;
  2. use std::ffi::OsString;
  3. use std::mem::zeroed;
  4. use winapi::ctypes::c_void;
  5. use winapi::shared::minwindef::LPVOID;
  6. use winapi::shared::ntdef::NULL;
  7. use winapi::shared::windef::HBITMAP;
  8. use winapi::shared::windef::HDC;
  9. use winapi::shared::windef::HGDIOBJ;
  10. use winapi::shared::windef::RECT;
  11. use winapi::um::fileapi::CreateFileA;
  12. use winapi::um::fileapi::WriteFile;
  13. use winapi::um::fileapi::CREATE_ALWAYS;
  14. use winapi::um::winbase::GlobalAlloc;
  15. use winapi::um::winbase::GlobalLock;
  16. use winapi::um::winbase::GHND;
  17. use winapi::um::wingdi::BitBlt;
  18. use winapi::um::wingdi::CreateCompatibleBitmap;
  19. use winapi::um::wingdi::CreateCompatibleDC;
  20. use winapi::um::wingdi::DeleteDC;
  21. use winapi::um::wingdi::DeleteObject;
  22. use winapi::um::wingdi::GetDIBits;
  23. use winapi::um::wingdi::GetObjectA;
  24. use winapi::um::wingdi::GetObjectW;
  25. use winapi::um::wingdi::SelectObject;
  26. use winapi::um::wingdi::SetStretchBltMode;
  27. use winapi::um::wingdi::StretchBlt;
  28. use winapi::um::wingdi::BITMAP;
  29. use winapi::um::wingdi::BITMAPFILEHEADER;
  30. use winapi::um::wingdi::BITMAPINFO;
  31. use winapi::um::wingdi::BITMAPINFOHEADER;
  32. use winapi::um::wingdi::BI_RGB;
  33. use winapi::um::wingdi::DIB_RGB_COLORS;
  34. use winapi::um::wingdi::HALFTONE;
  35. use winapi::um::wingdi::SRCCOPY;
  36. use winapi::um::winnt::FILE_ATTRIBUTE_NORMAL;
  37. use winapi::um::winnt::GENERIC_WRITE;
  38. use winapi::um::winnt::HANDLE;
  39. use winapi::um::winuser::GetClientRect;
  40. use winapi::um::winuser::GetDC;
  41. use winapi::um::winuser::GetDesktopWindow;
  42. use winapi::um::winuser::GetSystemMetrics;
  43. use winapi::um::winuser::SM_CXSCREEN;
  44. use winapi::um::winuser::SM_CYSCREEN;
  45.  
  46. fn main() {
  47.     const width: i32 = 1000;
  48.     const height: i32 = 500;
  49.     unsafe {
  50.         let desktopHandle = GetDesktopWindow();
  51.         let mut windowDC = GetDC(desktopHandle);
  52.         let mut screenDC = GetDC(std::ptr::null_mut());
  53.         let blitDC = CreateCompatibleDC(windowDC);
  54.         let mut rect = zeroed::<RECT>();
  55.         GetClientRect(desktopHandle, &mut rect);
  56.         SetStretchBltMode(windowDC, HALFTONE);
  57.         if StretchBlt(
  58.             windowDC,
  59.             0,
  60.             0,
  61.             rect.right,
  62.             rect.bottom,
  63.             screenDC,
  64.             0,
  65.             0,
  66.             GetSystemMetrics(SM_CXSCREEN),
  67.             GetSystemMetrics(SM_CYSCREEN),
  68.             SRCCOPY,
  69.         ) == 0
  70.         {
  71.             println!("Error StretchBlt");
  72.         };
  73.  
  74.         let outputBitmap =
  75.             CreateCompatibleBitmap(windowDC, rect.right - rect.left, rect.bottom - rect.top);
  76.         SelectObject(blitDC, outputBitmap as HGDIOBJ);
  77.  
  78.         if BitBlt(
  79.             blitDC,
  80.             0,
  81.             0,
  82.             rect.right - rect.left,
  83.             rect.bottom - rect.top,
  84.             windowDC,
  85.             0,
  86.             0,
  87.             SRCCOPY,
  88.         ) == 0
  89.         {
  90.             println!("There was an error BitBlt")
  91.         }
  92.         let mut bmpScreen: BITMAP = std::mem::uninitialized();
  93.         GetObjectW(
  94.             outputBitmap as HANDLE,
  95.             std::mem::size_of::<BITMAP>() as i32,
  96.             &mut bmpScreen as *mut BITMAP as LPVOID,
  97.         );
  98.         let mut bi = zeroed::<BITMAPINFO>();
  99.         let mut bmfHeader = zeroed::<BITMAPFILEHEADER>();
  100.         bi.bmiHeader.biSize = std::mem::size_of::<BITMAPINFOHEADER>() as u32;
  101.         bi.bmiHeader.biWidth = bmpScreen.bmWidth;
  102.         bi.bmiHeader.biHeight = bmpScreen.bmHeight;
  103.         bi.bmiHeader.biPlanes = 1;
  104.         bi.bmiHeader.biBitCount = 32;
  105.         bi.bmiHeader.biCompression = BI_RGB;
  106.         bi.bmiHeader.biSizeImage = 0;
  107.         bi.bmiHeader.biXPelsPerMeter = 0;
  108.         bi.bmiHeader.biYPelsPerMeter = 0;
  109.         bi.bmiHeader.biClrUsed = 0;
  110.         bi.bmiHeader.biClrImportant = 0;
  111.  
  112.         let bitCount = bi.bmiHeader.biBitCount as i32;
  113.         let dwBmpSize = ((bmpScreen.bmWidth * bitCount + 31) / 32) * 4 * bmpScreen.bmHeight;
  114.         let t = dwBmpSize as usize;
  115.  
  116.         let hDIB = GlobalAlloc(GHND, t);
  117.         let lpbitmap = GlobalLock(hDIB);
  118.  
  119.         if GetDIBits(
  120.             blitDC,
  121.             outputBitmap,
  122.             0,
  123.             bmpScreen.bmHeight as u32,
  124.             lpbitmap,
  125.             &mut bi,
  126.             DIB_RGB_COLORS,
  127.         ) == 0
  128.         {
  129.             println!("ERror: GetDIBIts")
  130.         };
  131.         let filename = CString::new("test.bmp").expect("CString failed");
  132.         let file = CreateFileA(
  133.             filename.as_ptr(),
  134.             GENERIC_WRITE,
  135.             0,
  136.             std::ptr::null_mut(),
  137.             CREATE_ALWAYS,
  138.             FILE_ATTRIBUTE_NORMAL,
  139.             std::ptr::null_mut(),
  140.         );
  141.         let sizeofBMF = std::mem::size_of::<BITMAPFILEHEADER>() as u32;
  142.         let sizeofBIH = std::mem::size_of::<BITMAPINFOHEADER>() as u32;
  143.         let dwSizeOfDIB = dwBmpSize as u32 + sizeofBMF + sizeofBIH;
  144.  
  145.         bmfHeader.bfOffBits = sizeofBIH + sizeofBMF;
  146.         bmfHeader.bfSize = dwSizeOfDIB;
  147.         bmfHeader.bfType = 0x4D42;
  148.  
  149.         WriteFile(
  150.             file,
  151.             &mut bmfHeader as *mut BITMAPFILEHEADER as LPVOID,
  152.             sizeofBMF,
  153.             std::ptr::null_mut(),
  154.             std::ptr::null_mut(),
  155.         );
  156.         WriteFile(
  157.             file,
  158.             &mut bi.bmiHeader as *mut BITMAPINFOHEADER as LPVOID,
  159.             sizeofBIH,
  160.             std::ptr::null_mut(),
  161.             std::ptr::null_mut(),
  162.         );
  163.         WriteFile(
  164.             file,
  165.             lpbitmap,
  166.             dwBmpSize as u32,
  167.             std::ptr::null_mut(),
  168.             std::ptr::null_mut(),
  169.         );
  170.  
  171.         // if ok != 0 {
  172.         //     let filename = CString::new("test.bmp").expect("CString failed");
  173.         //     CreateFileA(
  174.         //         filename.as_ptr(),
  175.         //         GENERIC_WRITE,
  176.         //         0,
  177.         //         std::ptr::null_mut(),
  178.         //         CREATE_ALWAYS,
  179.         //         FILE_ATTRIBUTE_NORMAL,
  180.         //         std::ptr::null_mut(),
  181.         //     );
  182.         // }
  183.  
  184.         DeleteObject(outputBitmap as HGDIOBJ);
  185.         DeleteDC(blitDC);
  186.     }
  187. }
  188.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement