お世話になります。
DWMの情報を取得するためにDwmGetCompositionTimingInfo関数を
以下のように呼び出すコードを書きましたが、
常にエラー(E_PENDING)が返ってきてしまいます。
DWM_TIMING_INFO dwmti;
dwmti.cbSize=sizeof(dwmti);
HRESULT hr=DwmGetCompositionTimingInfo(hwnd,&dwmti);
// ここで必ずエラー(E_PENDING)が返ってくる
この前後で別のDWM関数を呼び出すと、それは成功します。
BOOL fNcRendering;
hr=DwmGetWindowAttribute(hwnd,DWMWA_NCRENDERING_ENABLED,
&fNcRendering,sizeof(BOOL));
// これは成功する
どうすれば正常に動作させられるのでしょうか。
開発環境はVC 2008、OSはVista Home Premium SP2です。
# 答えではありません
Windows 7 Ultimate ですが、結果は同じですね。
検索してみてもほとんど資料がありません。MSDN にも情報が少なすぎます。
ただ、一般的に E_PENDING というのは、(真面目に実装されていれば)「関数の実行は
受理されたが、結果はまだ出せないので、後ほど取得すべし」というエラーコードだと
思います。
なので、失敗とは決めつけられない…と思うのですが。
DWM 系の他の関数を見ても、関数名から直感的に判断できる範囲では、その「後ほど取
得する」ものが見当たらないのが問題ですね。
お返事ありがとうございます。
EnumWindows()で取得した色々なウィンドウのハンドルを渡してみたり、
それらしい名前のDwmFlush()を呼んでみたり色々試行錯誤してみてもダメだったのですが、
なんと最初の引数をNULLにしたらS_OKが返ってきて、
DWM_TIMING_INFOにもそれらしい値が取得できました。
MSDNでもそんなこと一言も書いてないんですけどねぇ…。
おっしゃる通り、DWM系の関数は全然情報がありませんね。
MSDNを見ても、何の関数なのかの説明すら書いていなかったりしますし。
DwmGetCompositionTimingInfo DWM_TIMING_INFO で検索すると、
ここが一番上に出てきますね…。
ともあれ、今回はこれで解決とします。