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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0809
Begriff -いくす-ウィンドウキャプチャについて28解決


Begriff -いくす-

リンク

2007/8/9(Thu) 12:33:26|NO.10242

いま pizza様からのアドバイスを受け WM_PRINT を使って
自前でウィンドウキャプチャをしようとしていますが
オブジェクトに関しては正常にキャプチャされるのですが
mes boxf line 等が無効になってしまいキャプチャさません…
BitBlt を後からやると上書きされてしまい オブジェクトを隠してしまいます。
よろしくお願いいたします。



この記事に返信する


f

リンク

2007/8/10(Fri) 05:21:59|NO.10254

おい。昨日の昼に投稿されたものがなんで昨日の夜に投稿されたものより上に上がってるんだよ。
解答がほしいから他のスレより目立たそうと思って上に上げてるんですか?いくす君。
君は一体誰と話しているんだって感じ。いきなりpizzaとかいう名前だしてきたし、
pizzaって誰。
pizzaってヤツと話しているなら掲示板じゃなくてそいつとメールでも何でも一対一で話して
くれないかな。



f

リンク

2007/8/10(Fri) 08:15:11|NO.10255

誰かが回答を書き込んだものの内容の間違いに気付いて消した・・・。
外人営業マン書き込みがあったので管理者が削除した・・・。
お盆で帰省したご先祖様の親切心。
と言う見方もありかも知れないのでなんとも?

ま、内容については俺わからないのでパス^^

おしえてあげてエラい人^^



Begriff -いくす-

リンク

2007/8/10(Fri) 08:56:11|NO.10257

私は何もしてないです・・・



Begriff -いくす-

リンク

2007/8/10(Fri) 09:02:25|NO.10258

連続ですいません
誤解されるかもしれないので
pizza様からのアドバイスを受けたのは結構前のことです(前の自分の日本語おかしいです。
今やっていることは WM_PRINT を使って自前でウィンドウキャプチャをすること です。



f

リンク

2007/8/10(Fri) 10:13:03|NO.10259

つーか俺的には、何が分からんって「VM_PAINTでキャプチャ」ってのが一番分からないんだが。

元記事読んだら「VM_PAINTでいけるかも?」とアドバイスされてるようだが
これは「VM_PAINTでキャプチャしろ」と言っているんじゃなくて、
HSPに画面の更新をさせる為にVM_PAINTメッセージを送れと言っているんじゃないか?

思うに、「一度HSPの画面を最前面に出して、画面全体の画像から必要部分を切り抜け」
とアドバイスされているのではないか。

大体どんなコードになってるかも分からんのでは何をどうアドバイスせよと言うのか。

まあ画面のキャプチャなんかした事ないので、VM_PAINTメッセージで出来るのを
俺が知らないだけかもしれんが。


なんせ俺は分からないので、俺の書き込みで終わらせてはいけないと思う有志の方、
頑張ってくれ。



f

リンク

2007/8/10(Fri) 10:19:10|NO.10260

なんかWMをVMとか書いている俺が居て、我ながら笑った(笑



Begriff -いくす-

リンク

2007/8/10(Fri) 21:39:30|NO.10272

勝手にいじってしまいましたがこうゆう現象です

#include "user32.as" #include "gdi32.as" #define WM_PRINT 0x0317 #define WM_PRINTCLIENT 0x0318 #define SRCCOPY 0x00CC0020 #define PRF_CHECKVISIBLE 0x00000001 #define PRF_NONCLIENT 0x00000002 #define PRF_CLIENT 0x00000004 #define PRF_ERASEBKGND 0x00000008 #define PRF_CHILDREN 0x00000010 #define PRF_OWNED 0x00000020 title "screen 0" buf = "test" mesbox buf, 200, 200, 5 color 255 : boxf : color : pos 200, 0 mes "WM_PRINTのテスト" hwnd0 = hwnd dim rect, 4 GetWindowRect hwnd0, varptr(rect) screen 1, rect(2)-rect(0), rect(3)-Rect(1) title "screen 1" sendmsg hwnd0, WM_PRINT, hdc, PRF_NONCLIENT|PRF_CLIENT|PRF_CHILDREN redraw stop
私の認識が間違ってなければsendmsgでWM_PRINTを送ると描画される・・・?



As

リンク

2007/8/11(Sat) 00:52:20|NO.10275

そのAgeてしまったやつは俺です。
オブジェクトの動作をそのまま別ウィンドウにコピーしたいのかと思って消しました。

というかいくすさんはなにがしたいのですか?
別なウィンドウのオブジェクトや描画などすべてを動作をそのままに他のウィンドウに
移したいのですか?

それとも、HSPウィンドウをキャプチャしたいのですか?



一応スクリプト提示しておきますが・・・


#module #uselib "gdi32" #func BitBlt "BitBlt" sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr,sptr #uselib "user32" #func GetWindowDC "GetWindowDC" sptr #func ReleaseDC "ReleaseDC" sptr,sptr #deffunc capture int _hnd GetWindowDC _hnd ghdc=stat mref BMSCR,67 BitBlt BMSCR(4),0,0,ginfo(20),ginfo(21),ghdc,0,0,$C00020 ReleaseDC _hnd,ghdc redraw 1 return #global capture hwnd



naznyark

リンク

2007/8/11(Sat) 00:52:27|NO.10276

ウィンドウが WM_PRINT メッセージをどう処理するかは
アプリケーション(というかウィンドウプロシージャ)の
作者の自由です。

WM_PRINT メッセージを無視するように作られていれば
何の反応もありません。
(HSPのウィンドウは無視するように作られているようです。)



Begriff -いくす-

リンク

2007/8/11(Sat) 08:44:13|NO.10279

返答ありがとうございます。
私のしたいことはウィンドウのすべての要素(オブジェクト・描画)を動作しない形(画像として)
コピーすることです。
できればbuffer での画面をコピーしたいと思っています。
そして隠れている(メモリ上も)ウィンドウ に対して画面をコピーするときWM_PRINTメッセージが有効らしい っと考えているのですが、いかがでしょうか



f

リンク

2007/8/11(Sat) 11:31:27|NO.10284

誰も突っ込んでくれなくて寂しいのう・・・・。

ちなみに、XP以降でよければPrintWindowが使える。
#include "user32.as"
#uselib "user32" #func PrintWindow "PrintWindow" sptr , sptr , int //BOOL PrintWindow( // HWND hwnd, // Window to copy // HDC hdcBlt, // HDC to print into // UINT nFlags // Optional flags //); title "screen 0" buf = "test" mesbox buf, 200, 200, 5 color 255 : boxf : color : pos 200, 0 mes "WM_PRINTのテスト" hwnd0 = hwnd dim rect, 4 GetWindowRect hwnd0, varptr(rect) screen 1, rect(2)-rect(0), rect(3)-Rect(1) title "screen 1" PrintWindow hwnd0 , hdc , 0 redraw 1 stop

俺的にはこれ以外のやり方は本当に知らんので。



pizza

リンク

2007/8/14(Tue) 21:27:43|NO.10397

> BitBlt を後からやると上書きされてしまい オブジェクトを隠してしまいます。

WM_PRINTを送ったウィンドウにWM_PRINTCLIENTが来た時に
BitBltしてみてください。(描画先HDCはwParamに入っています。)



begriff -いくす-

リンク

2007/8/16(Thu) 13:08:39|NO.10424

返信ありがとうございます。
自前でやろうとしていましたが
pizza様のスプりクトが一番ですね
流石です…

前のスレッドで終わったことをぶり返してしまい申し訳なく思っております…



begriff -いくす-

リンク

2007/8/25(Sat) 22:25:27|NO.10677

一応頑張ってやってみましたが気にかかることがあります
mesboxの枠のデザインが古い(?)んです。
これは仕様によるものでしょうか。
直せるものなのですか。
#module
#include "user32.as" #include "gdi32.as" #define WM_PRINT 0x0317 #define WM_PRINTCLIENT 0x0318 #define SRCCOPY 0x00CC0020 #define PRF_CHECKVISIBLE 0x00000001 #define PRF_NONCLIENT 0x00000002 #define PRF_CLIENT 0x00000004 #define PRF_ERASEBKGND 0x00000008 #define PRF_CHILDREN 0x00000010 #define PRF_OWNED 0x00000020 #deffunc copy_window int b,int a gsel a oncmd gosub *cmd_pricli,WM_PRINTCLIENT hwnd_a=hwnd gsel b sendmsg hwnd_a,WM_PRINT,hdc,PRF_NONCLIENT|PRF_CLIENT|PRF_CHILDREN redraw oncmd 0 return *cmd_pricli if ginfo_intid!a:return sel=ginfo_sel gsel a BitBlt wParam,0,0,ginfo_winx,ginfo_winy,hdc,0,0,SRCCOPY gsel sel return #global gsel 0,-1 screen 4,,, title "コピー元" buf = "test" mesbox buf, 200, 200, 5 color 255 : boxf : color : pos 200, 0 mes "WM_PRINTのテスト\n\nmesboxのデザインがコピーするとおかしくなる?\n\nbutton に関しては特に異常はない" button "ok",*aa wxs=ginfo_wx2-ginfo_wx1 wys=ginfo_wy2-ginfo_wy1 screen 5,wxs,wys title "コピー先" copy_window 5,4 *aa



pizza

リンク

2007/8/26(Sun) 01:12:11|NO.10678

Meで実行してみましたが、正常にコピー出来ているみたいです。

古いデザインになると言うことはXP以降だと思うのですが、
fさんが紹介されているPrintWindowでは出来ないのでしょうか?

すみません、解決策に心当たりが無いです・・・。



begriff -いくす-

リンク

2007/8/26(Sun) 01:56:43|NO.10680

勝手な話かもしれません。
これは自分のポリシーですが、
"hsp自体はWin 98〜vista に対応しているのになんでこのソフトは何でこのパソコンでできないんだ"
と思われたくないですし、自身の気持ちとして互換性を保ちたいのです(限界はあるんでしょうね)
まあ、今のところデザイン面での問題ですのであまり気にしないようにして作業を進めていきます。
pizza様感謝しています。



eller

リンク

2007/8/26(Sun) 09:04:59|NO.10687

直接の解決につながる情報ではありませんが、一応報告いたします。

NO.10677のスクリプトがXPおよびVistaで正常に動作することを確認しました。OS依存の問題ではないようですね。



begriff -いくす-

リンク

2007/8/26(Sun) 09:23:31|NO.10688

eller様、動作確認誠にありがとうございます。

枠があるオブジェクトの枠がやはりクラシックでしょうか?



eller

リンク

2007/8/26(Sun) 09:34:02|NO.10689

いいえ、クラシックではなく新しいデザイン(Luna)になっています。2つの画面に表示される画像に、何の違いもありません。



begriff -いくす-

リンク

2007/8/26(Sun) 10:15:05|NO.10690

私の環境のせいでしょうか…
一応画像を上げてみます。
http://begriff.ehoh.net/copy_win.html



eller

リンク

2007/8/26(Sun) 11:02:04|NO.10691

その枠はオブジェクトが選択されているために表示される枠です。試しにボタンをクリックしてみてください。枠が消えるはずです。



begriff -いくす-

リンク

2007/8/26(Sun) 11:40:23|NO.10692

すいません
変わりません…

情報を更新しました

http://begriff.ehoh.net/copy_win.html



eller

リンク

2007/8/26(Sun) 11:47:00|NO.10693

確かに薄くですが枠が残ってしまうようですね。見落としていました。

ちょっと調べてみたところ、拡張ウィンドウスタイルWS_EX_CLIENTEDGEを除いてしまえば問題ないようです(下記スクリプト参照)が、それでは根本的な解決になりませんね。
私では荷が重いので、APIに詳しい方で解決方法が分かる方がいらっしゃいましたらご教示お願いいたします。
// 参考:Let's HSP!(http://lhsp.s206.xrea.com/hsp_object2.html#6
#include "user32.as" #include "gdi32.as" #module #define WM_PRINT 0x0317 #define WM_PRINTCLIENT 0x0318 #define SRCCOPY 0x00CC0020 #define PRF_CHECKVISIBLE 0x00000001 #define PRF_NONCLIENT 0x00000002 #define PRF_CLIENT 0x00000004 #define PRF_ERASEBKGND 0x00000008 #define PRF_CHILDREN 0x00000010 #define PRF_OWNED 0x00000020 #deffunc copy_window int p1, int p2 gsel p2 oncmd gosub *cmd_pricli, WM_PRINTCLIENT hwnd_a = hwnd gsel p1 sendmsg hwnd_a, WM_PRINT, hdc, PRF_NONCLIENT | PRF_CLIENT | PRF_CHILDREN redraw oncmd 0 return *cmd_pricli if ginfo_intid ! p2 : return sel = ginfo_sel gsel p2 BitBlt wParam, 0, 0, ginfo_winx, ginfo_winy, hdc, 0, 0, SRCCOPY gsel sel return #global gsel 0, -1 screen 4, 600, 200 : title "コピー元" buf = "test" mesbox buf, 200, 200, 5 SetWindowLong objinfo (0, 2), -20, $0 SetWindowPos objinfo (0, 2), 0, 0, 0, 0, 0, $27 syscolor 15 : boxf color : pos 200, 0 : mes "WM_PRINTのテスト\n\nmesboxのデザインがコピーするとおかしくなる?\n\nbutton に関しては特に異常はない" button "ok",*aa screen 5, ginfo_wx2 - ginfo_wx1, ginfo_wy2 - ginfo_wy1 : title "コピー先" copy_window 5, 4 *aa stop



begriff -いくす-

リンク

2007/8/26(Sun) 13:28:09|NO.10698

こればっかりはどうしようもないと割り切りますかね…
まぁ デザインの問題ですから動作には影響ないと願ってみます。



root

リンク

2007/8/26(Sun) 22:50:26|NO.10703

WM_PRINTが来てもXPのコントロールがVisualStyleの枠線を描画しないのはバグみたいです。
http://www.codeproject.com/cs/miscctrl/XPTaskBar.asp#WM_PRINT
ちょっと解決は難しいですね...(^_^;



begriff -いくす-

リンク

2007/8/26(Sun) 23:18:08|NO.10705

それはつまりHSPでいくら試行錯誤しようとも、windowsそのものの欠陥であるのでどうしようもないということですか…
sp3(2008年予定?)に期待…?
そういう専門の窓口ってあるものなのでしょうかね?



f

リンク

2007/8/27(Mon) 08:12:51|NO.10707

つーか、XP以前か以降可かを識別してWM_PRINTかPRINTWINDOWを使い分ければ済む事なんでね?



begriff -いくす-

リンク

2007/8/27(Mon) 09:38:18|NO.10708

了解いたしました。
皆様ありがとうございます。



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