WindowsAPIでデスクトップ画面を表示する方法

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
スー

WindowsAPIでデスクトップ画面を表示する方法

#1

投稿記事 by スー » 16年前

こんばんは。
私は今、WindowsAPIでスクリーンセーバーを作っています。
今回の目標はデスクトップの画面を表示しつつ、何かの画像を表示させることです。
WindowsVista付属のスクリーンセーバー「バブル」くらいを作れたらいいなぁと思っています。

デスクトップ画面を取得する関数を作ってみても、白い円しか表示されないです。
つまりデスクトップ画面の取得ができてないっぽいのですが、どこがおかしいかわかりません。
どうかおかしい点を教えてください。
よろしくお願いします。

環境は
VC++2005
windowsXP
です。

以下ソースです。
#include <windows.h> 
#include <scrnsave.h>

//スクリーンセーバを作るためのライブラリ
#pragma comment(lib,"ScrnSave.lib")
#pragma comment(lib,"Comctl32.lib")

//タイマーのID
#define ID_TIMER 32767

//ウインドの縦幅、横幅
int wx,wy;

RECT rc;
HDC hdc;

void GetDeskTop(){
	HWND DeskhWnd;
	HDC Deskhdc;

	//デスクトップのハンドルを取得
	DeskhWnd = GetDesktopWindow();
	//デスクトップのデバイスコンテキストのハンドルが取得
	Deskhdc = GetDC(DeskhWnd);
	//hdcへ転送
	BitBlt(hdc,0,0,100,100, Deskhdc,0,0,SRCCOPY);
	//解放
	ReleaseDC(DeskhWnd,Deskhdc);

}

LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){

    switch(msg){
		case WM_CREATE:
            GetClientRect(hWnd,&rc);

			//ウインドの縦幅、横幅取得
            wx = rc.right-rc.left;
            wy = rc.bottom-rc.top;
			//タイマーセット
            SetTimer(hWnd,ID_TIMER,16,NULL);
            break;
        case WM_TIMER:

			hdc = GetDC(hWnd);

			//デスクトップ画像を表示する関数
			GetDeskTop();
			//白い円を書いてみる
			//予定ならデスクトップの画像+白い円が表示される
			RoundRect(hdc , 100 , 100 , 120 , 120 , 60 , 60);
			ReleaseDC(hWnd , hdc);

            break;
        case WM_DESTROY:
            KillTimer(hWnd,ID_TIMER);
            PostQuitMessage(0);
            return 0;
        default:
            break;
    }
    return DefScreenSaverProc(hWnd, msg, wParam, lParam);
}

BOOL WINAPI ScreenSaverConfigureDialog(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam){
    return TRUE;
}

BOOL WINAPI RegisterDialogClasses(HANDLE hInst){
    return TRUE;
}

toyo

Re:WindowsAPIでデスクトップ画面を表示する方法

#2

投稿記事 by toyo » 16年前

LRESULT WINAPI ScreenSaverProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
に
	case WM_ERASEBKGND:
		return TRUE;
を入れないと背景が消されるので消されたデスクトップを取得しているのかも

スー

Re:WindowsAPIでデスクトップ画面を表示する方法

#3

投稿記事 by スー » 16年前

toyoさんありがとうございます。
>case WM_ERASEBKGND:
>	return TRUE;
をswitch文の所にいれたら無事にデスクトップ画面を取得できました。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る