アカウント名:
パスワード:
ウィンドウの位置やサイズを変えること自体は、ウィンドウハンドルさえ拾ってこれれば SetWindowPos API で可能です (別プロセスのウィンドウであっても)。表示されているウィンドウのハンドルは、EnumWindows API などを使えば列挙できます。
最大化表示されているウィンドウをどうするかとか、大きさの変更できないウィンドウへの対処などを考える必要はありますが、やってやろうと思えば、F10 相当のタイル表示についてはできないこともないと思いま
むぅ、なるほど。今アップルのデモをもう一度見直してみたのですが、ウィンドウの中身の縮尺も同時に変化していたのですね。さすがにこいつは無理だ(w。
キャプチャリングした画像を使って誤魔化そうにも、今の Windows の実装ではクリッピングされている部分はキャプチャリングできな
えと、こんな感じでやってみたのですが、うまく行きませんでした。。。
void CCaptureShowWnd::Capture(HWND wnd) { delete_bitmap(); CRect rect; BOOL ret = ::GetWindowRect(wnd, &rect); ASSERT(ret); // 一時的にレイヤードウィンドウ化 LONG flags = ::GetWindowLong(wnd, GWL_EXSTYLE); ::SetWindowLong(wnd, GWL_EXSTYLE, flags | WS_EX_LAYERED); // キャプチャー対象のウィンドウを再描画 ::UpdateWindow(wnd); // DC 取得 ~ ビットマップ構築 HDC dc = ::GetWindowDC(wnd); ASSERT(dc); HDC mem_dc = ::CreateCompatibleDC(dc); m_bitmap = ::CreateCompatibleBitmap(dc, rect.Width(), rect.Height()); HBITMAP old_bitmap = (HBITMAP) ::SelectObject(mem_dc, m_bitmap); // キャプチャリング ret = ::BitBlt(mem_dc, 0, 0, rect.Width(), rect.Height(), dc, 0, 0, SRCCOPY); ASSERT(ret); // 後始末 ::SelectObject(mem_dc, old_bitmap); ret = ::DeleteDC(mem_dc); ASSERT(ret); ret = ::ReleaseDC(wnd, dc); ASSERT(ret); ::SetWindowLong(wnd, GWL_EXSTYLE, flags); }
結果として、上に重なっているウィンドウのイメージがそのまま取れちゃってます。。。
レイヤードウィンドウとか使うの初めてなので何か間違ってるかもしれませんが (^_^;、お気づきの点とかあれば突っ込みいただければと。。。
こちらもあまり突っ込んだ実験したわけでもないですが。
仰られた通り、SetWindowLong() の後に、
::SetLayeredWindowAttributes(wnd, 0, 0, LWA_ALPHA);
としてみたところ、当該ウィンドウが一時的に非表示になったり、結構重たかったりといった難点はあるものの、クリッピングされていない状態でキャプチャリングに成功しました!!
一応、出来上がったものをここ [asahi-net.or.jp]に置いておきますので、興味のある方は持っていって動かして見てくだちゃい。
今回は大変勉強になりました。。。> Ying 様 m(_ _)m
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
ハッカーとクラッカーの違い。大してないと思います -- あるアレゲ
買ってみました (スコア:1, 参考になる)
…とり急ぎ、
絶対買っちゃダメです>ALL
とだけ書いておきます。
細かくは後でまたレビューするね…。
Re:買ってみました (スコア:5, 参考になる)
もうね、バカかと、ア(略
仕組みはもうみなさんご想像の通り、ホットキー or ホットスポットでイベントを感知したら
全画面に(枠の無い)ウインドウを開いて、縮小した各ウインドウイメージを描画してアニメーションしてるだけですね。
だから…
・遅い(重い)、ちらちらする
・ウインドウの切替操作はできるが、それ以外のことができない(オブジェクトのドラッグ&ドロップ?なんすかそれ?)
・各ウインドウのサーフェースを取得するためか、常駐してるだけで(Expose動作をしなくても)全体的にPC負荷が高くなるヽ(`Д´)ノ
Re:買ってみました (スコア:2, 興味深い)
結局そういう事したければ Longhorn を待て、という事でしょうか。
わざわざ買わんでも微妙な競合機能は確実に実装されると思いますが。
# Apple と Sony は良きモルモット
無理なのか? (スコア:1)
ウィンドウの位置やサイズを変えること自体は、ウィンドウハンドルさえ拾ってこれれば SetWindowPos API で可能です (別プロセスのウィンドウであっても)。表示されているウィンドウのハンドルは、EnumWindows API などを使えば列挙できます。
最大化表示されているウィンドウをどうするかとか、大きさの変更できないウィンドウへの対処などを考える必要はありますが、やってやろうと思えば、F10 相当のタイル表示についてはできないこともないと思いま
むらちより/あい/をこめて。
Re:無理なのか? (スコア:0)
微妙に意味合いが違ってきますね。>SetWindowPos
で、レビューを見る限りWinExposeがやろうとしているのはExposeと
同じことなので、それを使えるレベルで実装するにはLonghornの
描画機構が必要、ということでしょう。
無理っすね (^_^; (スコア:1)
むぅ、なるほど。今アップルのデモをもう一度見直してみたのですが、ウィンドウの中身の縮尺も同時に変化していたのですね。さすがにこいつは無理だ(w。
キャプチャリングした画像を使って誤魔化そうにも、今の Windows の実装ではクリッピングされている部分はキャプチャリングできな
むらちより/あい/をこめて。
Re:無理っすね (^_^; (スコア:1)
やっぱし無理っす (そろそろオフトピ気味。。。) (スコア:2, 興味深い)
えと、こんな感じでやってみたのですが、うまく行きませんでした。。。
結果として、上に重なっているウィンドウのイメージがそのまま取れちゃってます。。。
レイヤードウィンドウとか使うの初めてなので何か間違ってるかもしれませんが (^_^;、お気づきの点とかあれば突っ込みいただければと。。。
むらちより/あい/をこめて。
Re:やっぱし無理っす (そろそろオフトピ気味。。。) (スコア:1)
こちらもあまり突っ込んだ実験したわけでもないですが。
できちゃいました (!!) (スコア:1)
仰られた通り、SetWindowLong() の後に、
としてみたところ、当該ウィンドウが一時的に非表示になったり、結構重たかったりといった難点はあるものの、クリッピングされていない状態でキャプチャリングに成功しました!!
一応、出来上がったものをここ [asahi-net.or.jp]に置いておきますので、興味のある方は持っていって動かして見てくだちゃい。
今回は大変勉強になりました。。。> Ying 様 m(_ _)m
むらちより/あい/をこめて。