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