HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0202
prince自ウィンドウの下にあるウィンドウの画像を取得したい・拡大鏡APIについて5解決


prince

リンク

2015/2/2(Mon) 13:40:57|NO.67223

現在、bgscrを使った半透明なウィンドウのソフトを製作しており、半透明処理をAeroでなく自前で(hspcvのブラー効果)行いたいと思っています。
そこでBitBltでスクリーンキャプチャをし、ブラー効果をかけようと思ったのですが、自分のウィンドウが邪魔になります。
XPまではBitBltでCAPTUREBLTをを指定せず、自ウィンドウをレイヤードウィンドウにすればよかったらしいのですが、
Vista以降はCAPTUREBLTを指定しなくてもレイヤードウィンドウの画像も取得してしまい、困っています。
(http://hsp.tv/play/pforum.php?mode=pastwch&num=53117)

BitBlt以外の方法についていろいろ調べたところ拡大鏡APIというものを見つけたのですが、
(http://dobon.net/vb/bbs/log3-39/24009.html)
日本語の資料が少なくてよくわかりません…

まとめると
1.BitBltで自ウィンドウ以外をキャプチャするにはどうすればいいか?
2.1ができないのであれば、拡大鏡APIを使いたいが、使い方を教えてほしい。

質問が長くなってしまい、読みにくいかもしれませんがよろしくお願いします。



この記事に返信する


rou

リンク

2015/2/3(Tue) 19:36:09|NO.67247

ここのページの通りやれば拡大鏡はできたけどprinceさんのやりたいことができるかは不明です。
http://www.orangemaker.sakura.ne.jp/labo/memo/sdk-mfc/magwin.html
拡大鏡の画像を取得できるのか不明なので
単純に拡大鏡のウインドウハンドルからGetDC+Bitbltではできないみたいです。
デスクトップからのBitbltでは普通に写ってるけど


#include "user32.as" #uselib "Magnification.dll" #func MagInitialize "MagInitialize" #func MagSetWindowTransform "MagSetWindowTransform" sptr,sptr #func MagSetWindowSource "MagSetWindowSource" sptr,sptr,sptr,sptr,sptr #func MagUninitialize "MagUninitialize" #define WS_EX_LAYERED 0x00080000 #define LWA_COLORKEY 1 #define LWA_ALPHA 2 #define GWL_EXSTYLE -20 #define WC_MAGNIFIER "Magnifier" #define WS_CHILD $40000000 #define MS_CLIPAROUNDCURSOR 0x0002 #define WS_VISIBLE $10000000 #module //float作成モジュール。http://sprocket.babyblue.jp/html/hsp_koneta3.htmから拝借 #defcfunc tofloat double p1 temp = p1 return lpeek(temp)>>29&7|(p1<0)<<31|lpeek(temp,4)-(p1!0)*0x38000000<<3 #global onexit *exit MagInitialize GetWindowLong hwnd , GWL_EXSTYLE SetWindowLong hwnd , GWL_EXSTYLE , stat | WS_EX_LAYERED SetLayeredWindowAttributes hwnd, 0, 255, LWA_ALPHA winobj WC_MAGNIFIER,"MagnifierWindow",0,WS_CHILD | MS_CLIPAROUNDCURSOR | WS_VISIBLE,ginfo_winx,ginfo_winy,0,0 hmag=objinfo_hwnd(stat) dim matrix,3,3 factor=2.0//拡大率 matrix(0,0)=tofloat(factor) matrix(1,1)=tofloat(factor) matrix(2,2)=tofloat(1.0) MagSetWindowTransform hmag,varptr(matrix) sx=int(double(ginfo_winx)/factor) sy=int(double(ginfo_winy)/factor) repeat rect=ginfo_mx-sx/2,ginfo_my-sy/2,ginfo_mx+sx/2,ginfo_my+sy/2 if rect(0)<0:rect(0)=0:rect(2)=sx if rect(1)<0:rect(1)=0:rect(3)=sy if rect(2)>ginfo_dispx:rect(0)=ginfo_dispx-sx:rect(2)=ginfo_dispx if rect(3)>ginfo_dispy:rect(1)=ginfo_dispy-sy:rect(3)=ginfo_dispy MagSetWindowSource hmag,rect(0),rect(1),rect(2),rect(3) InvalidateRect hmag,0,1 wait 10 loop *exit clrobj MagUninitialize end



774

リンク

2015/2/4(Wed) 20:09:55|NO.67269

>1.BitBltで自ウィンドウ以外をキャプチャするにはどうすればいいか?
こちらの ◆技術的な詳細 > ◆Win9x互換モード の内容が参考になるかも知れません。
>http://www.ksky.ne.jp/~seahorse/libgw/



prince

リンク

2015/2/8(Sun) 09:18:06|NO.67319

>>rouさん
ありがとうございます。それがやりたかったんですが、
WoW64のバグでうまくMagnification APIが正しく動作しないのを忘れていました…
HSPが64bitに対応したら(3.5でするのかな?)また挑戦してみたいと思います。

>>774さん
提示していただいたページにも書いてありますが、その方法だと
>>Win9xモードではウィンドウの背景は隠された瞬間に固定されるので、見えているものは最新とは限らない。(仕様)
ことになってしまいます。

自分でウィンドウの下のウィンドウを取得->BitBlt->重ね合わせ
という方法を思いついたので、解決にします。



skyblue

リンク

2015/2/8(Sun) 10:40:20|NO.67320

>HSPが64bitに対応したら(3.5でするのかな?)また挑戦してみたいと思います。
今のところ、Dishのios以外での64bit対応の予定はありませんが、
将来は変わるかも知れません、2100年とかに32bitOSが過去のものになるとかでない限りは。



prince

リンク

2015/2/8(Sun) 11:30:44|NO.67323

>>skyblueさん
3.5で実装されるかも…
http://dev.onionsoft.net/trac/openhsp/changeset/662



ONION software Copyright 1997-2023(c) All rights reserved.