Ver Mensaje Individual
  #7
Antiguo 12 de marzo de 2017, 14:15
Kuk
Administrador
Última Actividad 19.09.2026 20:11
Posts Posts: 2.500
Likes enviados Enviados: 1037
Likes recibidos Recibidos: 1207

Hrmcobol, aquí va el código y la DLL compilada:

Código CPP:
  1. #include <Windows.h>
  2. #include <Gdiplus.h>
  3.  
  4. #define DllExport __declspec( dllexport )
  5.  
  6. extern "C" {
  7.  
  8. DllExport void __stdcall ScreenShot(char*BmpName, HWND WndHwnd)
  9. {
  10.     RECT DesktopParams;
  11.     HDC DevC = GetDC(WndHwnd);
  12.     GetWindowRect(WndHwnd,&DesktopParams);
  13.     DWORD Width = DesktopParams.right - DesktopParams.left;
  14.     DWORD Height = DesktopParams.bottom - DesktopParams.top;
  15.  
  16.     DWORD FileSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBTRIPLE)+1*(Width*Height*4));
  17.     char *BmpFileData = (char*)GlobalAlloc(0x0040,FileSize);
  18.  
  19.     PBITMAPFILEHEADER BFileHeader = (PBITMAPFILEHEADER)BmpFileData;
  20.     PBITMAPINFOHEADER  BInfoHeader = (PBITMAPINFOHEADER)&BmpFileData[sizeof(BITMAPFILEHEADER)];
  21.  
  22.     BFileHeader->bfType = 0x4D42; // BM
  23.     BFileHeader->bfSize = sizeof(BITMAPFILEHEADER);
  24.     BFileHeader->bfOffBits = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
  25.  
  26.     BInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
  27.     BInfoHeader->biPlanes = 1;
  28.     BInfoHeader->biBitCount = 24;
  29.     BInfoHeader->biCompression = BI_RGB;
  30.     BInfoHeader->biHeight = Height;
  31.     BInfoHeader->biWidth = Width;
  32.  
  33.     RGBTRIPLE *Image = (RGBTRIPLE*)&BmpFileData[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)];
  34.     RGBTRIPLE color;
  35.  
  36.     HDC CaptureDC = CreateCompatibleDC(DevC);
  37.     HBITMAP CaptureBitmap = CreateCompatibleBitmap(DevC,Width,Height);
  38.     SelectObject(CaptureDC,CaptureBitmap);
  39.     BitBlt(CaptureDC,0,0,Width,Height,DevC,0,0,SRCCOPY|CAPTUREBLT);
  40.     GetDIBits(CaptureDC,CaptureBitmap,0,Height,Image,(LPBITMAPINFO)BInfoHeader, DIB_RGB_COLORS);
  41.  
  42.     DWORD Junk;
  43.     HANDLE FH = CreateFileA(BmpName,GENERIC_WRITE,FILE_SHARE_WRITE,0,CREATE_ALWAYS,0,0);
  44.     WriteFile(FH,BmpFileData,FileSize,&Junk,0);
  45.     CloseHandle(FH);
  46.         GlobalFree(BmpFileData);
  47. }
  48.  
  49. } //undecorate

Para llamar la función desde PowerCOBOL, en el fichero COBOL85.CBR ponemos:

Código:
[MainForm.Entry]
ScreenShot=PrintScreen.dll
En el código:

Código COBOL:
  1.  ENVIRONMENT     DIVISION.
  2.  DATA            DIVISION.
  3.  WORKING-STORAGE SECTION.
  4.  01  PrinScreen  PIC X(50)  VALUE "ScreenShot".
  5.  01  WsPath      PIC X(250).
  6.  01  FrmHWND     PIC S9(9) COMP-5.
  7.  PROCEDURE       DIVISION.
  8.      
  9.      MOVE "hwnd" OF POW-SELF TO FrmHWND
  10.      MOVE "C:\001.BMP"       TO WsPath
  11.      
  12.      CALL PrinScreen WITH STDCALL USING BY REFERENCE WsPath
  13.                                         BY VALUE FrmHWND
Archivos Adjuntos
Tipo de Archivo: rar PrintScreen.rar (30,8 KB)Descargas: 179



NORMAS DEL FORO - para garantizar el buen funcionamiento del Foro.
¿Te han ayudado? NO TE OLVIDES de darle a
¿Quieres dirigirte a alguien en tu post? Notifícale haciendo clic en su Nick
Kuk is offline   Responder Con Cita