1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #include <stdio.h>
#include <windows.h>
int ClipboardToBmp(char *nomfich)
{
HANDLE hret;
HANDLE hFile;
char *p=0;
long len_global, debut_pixels;
BITMAPFILEHEADER file_header = { 0 };
BITMAPINFOHEADER *info;
int longueur_palette=0;
int ret = 0;
DWORD bytes_written=0;
// Ça prend un nom de fichier
if (!nomfich) return (0);
// Ouvrir le clipboard
if (!OpenClipboard(0)) return (0);
// Récupérer l'image
hret = GetClipboardData(CF_DIB);
if (!hret) {
CloseClipboard();
return (0);
}
// Récupérer l'adresse du bloc mémoire
p = (char *) GlobalLock(hret);
if (!p) {
CloseClipboard();
return (0);
}
// Récupérer la longueur du bloc mémoire
len_global = GlobalSize(hret);
// La mémoire contient un BITMAPINFOHEADER
// suivi de la palette si elle existe
// et ensuite viennent les bits de l'image.
info = (BITMAPINFOHEADER *) p;
// Calculons la longueur de la palette
switch (info->biBitCount) {
case 1: longueur_palette = 2 * sizeof(RGBQUAD); break;
case 4: longueur_palette = 16 * sizeof(RGBQUAD); break;
case 8: longueur_palette = 256 * sizeof(RGBQUAD); break;
case 16:
case 32: if (info->biCompression == BI_BITFIELDS) {
// Il y a des masques de bits.
// Voir la description de BITMAPINFOHEADER
longueur_palette = 3 * sizeof(DWORD);
}
break;
}
// Calculons le début des pixels
debut_pixels = sizeof(BITMAPFILEHEADER)
+ info->biSize
+ longueur_palette;
// Plaçons les valeurs dans la structure BITMAPFILEHEADER
file_header.bfType = 0x4d42;
file_header.bfSize = sizeof(BITMAPFILEHEADER) + len_global;
file_header.bfOffBits = debut_pixels;
hFile = CreateFile(nomfich, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if (hFile) {
ret = WriteFile(hFile, (void *) &file_header, sizeof(BITMAPFILEHEADER), &bytes_written, 0);
ret = WriteFile(hFile, (void *) p, len_global, &bytes_written, 0);
CloseHandle(hFile);
}
GlobalUnlock(hret);
CloseClipboard();
return (ret);
}
/* ---------------------------------------------------------------------- */
void CaptureEcran(int fenetre_seulement)
{
keybd_event(VK_SNAPSHOT, fenetre_seulement, 0, 0);
}
/* ---------------------------------------------------------------------- */
int main(int argc, char *argv[])
{
if (argc < 2) {
printf("Usage: window2bmp nom_de_fichier.bmp\n");
return (1);
}
CaptureEcran(1);
Sleep(1000);
if (!ClipboardToBmp(argv[1])) {
printf("Une erreur est survenue!\n");
return (1);
}
printf("Conversion Ok!\n");
return (0);
} |
Partager