Windowsではデスクトップヒープというものがあります。メニューやアイコン、ウィンドウを作られるたびにここから取られます。なくなるとプロセスの起動に失敗します。
Desktop Heap Overview - Ntdebugging Blog - Site Home - MSDN Blogs
Windows Server 2003 R2まではカーネルデバッガかDesktop Heap Monitorを使って調べなくてはならなかったのですが、Windows Vista以降はAPIで取得できるようなので、やってみました。こんな感じ。
#define WINVER 0x0701 #include <windows.h> int _tmain(int argc, _TCHAR* argv[]) { HDESK hDesktop = OpenInputDesktop(0, FALSE, GENERIC_READ); ULONG ulHeapSize = 0; DWORD dwNeeded = 0; if(!GetUserObjectInformation(hDesktop, UOI_HEAPSIZE, &ulHeapSize, sizeof(ULONG), &dwNeeded)) { _tprintf(_T("Error:%ld\n"), GetLastError()); }else{ _tprintf(_T("Heap Size:%ld\n"), ulHeapSize); } CloseDesktop(hDesktop); return 0; }
最初、デスクトップヒープはWindow Stationに関連づくものだから、GetProcessWindowStation()で取ったWindow Stationのハンドルでいいかと思っていたら、デスクトップハンドルでした…。ちなみにちょっと古いけど各OSでのデフォルト設定はこちら。
Desktop Heap, part 2 - Ntdebugging Blog - Site Home - MSDN Blogs
Windows 7 Ultimate X64で実行すると20MB位あるようです。デスクトップとサービスでは違う値になります。これ実行して気づいたんですが、残量じゃなくて、現在の設定値のようです…デスクトップヒープの残量が取得できればうれしいのですけど…。