私は今、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;
}