imgctl.dll 1.22 を使用してデスクトップをビットマップとして保存 :【VC++】


imgctl.dll 1.22 およびヘッダファイルは同梱しています

ブラウザでダウンロード
バッチ処理支援として
昔々作った埋もれたコードが沢山あるので、
ちょっとしたバッチツールに使えるようにしました。

どうやれば実装できるか解っていても、
実際他人の dll を使おうとするとそれなりに時間を費やします。
そのへんのサンプルになれば良いと思うのですが。

imgctl.dll は、強力な機能が沢山あるので、
真剣にやりだすと大変なのでまずはこの程度です。
// *********************************************************
// imgctl.dll 1.22 
// ( http://www.vector.co.jp/soft/win95/prog/se222453.html )
// を使用してデスクトップをビットマップとして保存します
//
// ※ imgctl.dll は同梱してあります
//
// 引数を指定しないと、カレントに desktop.bmp を作成します
// 引数を指定すると、それをファイル名として使用します
// ↑パスにスペースを含む場合は、" で囲って下さい
// *********************************************************

#include <windows.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <stdio.h>

#define IMGCTL_RUNTIME
#define WINAPI __stdcall
#include "imgctl.h"
#define LOAD_DLL(STRPATH) \
	lib = LoadLibrary( STRPATH ); \
if ( lib == NULL ) { \
		MessageBox( hWnd, "dllをロードできません", "", MB_OK ); \
		return 0; \
	}
#define LOAD_FUNC(TYPE,FUNC) \
	TYPE FUNC; \
	FUNC = (TYPE)GetProcAddress( lib, #FUNC ); \
	if ( FUNC == NULL ) { \
		FreeLibrary( lib ); \
		MessageBox( hWnd, #FUNC " をロードできません", "", MB_OK ); \
		return 0; \
	}

// *********************************************************
// Windows アプリケーションとしてのエントリポイント
// Link.exe で /SUBSYSTEM:WINDOWS がデフォルトで
// 指定される事になります
// *********************************************************
int APIENTRY _tWinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPTSTR lpCmdLine,
	int nCmdShow
)
{

	// *******************************************
	// デスクトップ
	// *******************************************
	HWND hWnd;
	hWnd = GetDesktopWindow();

	// *******************************************
	// ファイル名
	// *******************************************
	char filename[512];
	if ( lpCmdLine[0] == 0x00 ) {
		lstrcpy( filename, "desktop.bmp" );
	}
	else {
		if ( lpCmdLine[0] == '"' ) {
			lpCmdLine[lstrlen(lpCmdLine)-1] = 0x00;
			lstrcpy( filename, lpCmdLine+1 );
		}
		else {
			lstrcpy( filename, lpCmdLine );
		}
	}

	// *******************************************
	// 変数
	// *******************************************
	HINSTANCE lib;
	HDIB hDib;
	hDib = NULL;
	DWORD ret;

	// *******************************************
	// DLL 準備
	// *******************************************
	LOAD_DLL("imgctl.dll")
	LOAD_FUNC(DELETEDIB,DeleteDIB)
	LOAD_FUNC(DIBTOBMP,DIBtoBMP)
	LOAD_FUNC(DCTODIB,DCtoDIB)
	LOAD_FUNC(IMGCTLERRORCLEAR,ImgctlErrorClear)
	LOAD_FUNC(IMGCTLERROR,ImgctlError)

	RECT rt;
	HDC hDc;

	// *******************************************
	// ハンドル取得
	// *******************************************
	GetWindowRect( GetDesktopWindow(), &rt );
	hDc = GetDC( hWnd );

	// *******************************************
	// 処理
	// *******************************************
	ImgctlErrorClear();
	hDib = DCtoDIB( hDc, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top );
	ret = ImgctlError();
	if ( ret == ICERR_PARAM_NULL || ret == ICERR_API_STRETCH ) {
		ReleaseDC( hWnd, hDc );
		FreeLibrary( lib );
		MessageBox( hWnd, "メモリデバイスコンテキストよりDIBを作成できませんでした",
			"", MB_OK );
		return 0;
	}

	if ( !DIBtoBMP( filename, hDib ) ) {
		ReleaseDC( hWnd, hDc );
		DeleteDIB( hDib );
		FreeLibrary( lib );
		MessageBox( hWnd, "ビットマップファイルを作成できませんでした",
			"", MB_OK );
		return 0;
	}

	// *******************************************
	// 終了
	// *******************************************
	ReleaseDC( hWnd, hDc );
	DeleteDIB( hDib );

	FreeLibrary( lib );

	return 0;
}