DwmGetCompositionTimingInfo()が失敗する

[戻る]
iy 2010/01/10(日) 22:26:18
お世話になります。

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です。

aetos 2010/01/11(月) 22:05:24
# 答えではありません

Windows 7 Ultimate ですが、結果は同じですね。
検索してみてもほとんど資料がありません。MSDN にも情報が少なすぎます。

ただ、一般的に E_PENDING というのは、(真面目に実装されていれば)「関数の実行は
受理されたが、結果はまだ出せないので、後ほど取得すべし」というエラーコードだと
思います。
なので、失敗とは決めつけられない…と思うのですが。
DWM 系の他の関数を見ても、関数名から直感的に判断できる範囲では、その「後ほど取
得する」ものが見当たらないのが問題ですね。

iy 2010/01/12(火) 00:18:14
[[解決]]
お返事ありがとうございます。

EnumWindows()で取得した色々なウィンドウのハンドルを渡してみたり、
それらしい名前のDwmFlush()を呼んでみたり色々試行錯誤してみてもダメだったのですが、
なんと最初の引数をNULLにしたらS_OKが返ってきて、
DWM_TIMING_INFOにもそれらしい値が取得できました。
MSDNでもそんなこと一言も書いてないんですけどねぇ…。

おっしゃる通り、DWM系の関数は全然情報がありませんね。
MSDNを見ても、何の関数なのかの説明すら書いていなかったりしますし。
DwmGetCompositionTimingInfo DWM_TIMING_INFO で検索すると、
ここが一番上に出てきますね…。

ともあれ、今回はこれで解決とします。

古いスレッドには追加発言できません。