|
|
2007/8/9(Thu) 12:33:26|NO.10242
いま pizza様からのアドバイスを受け WM_PRINT を使って
自前でウィンドウキャプチャをしようとしていますが
オブジェクトに関しては正常にキャプチャされるのですが
mes boxf line 等が無効になってしまいキャプチャさません…
BitBlt を後からやると上書きされてしまい オブジェクトを隠してしまいます。
よろしくお願いいたします。
|
|
2007/8/10(Fri) 05:21:59|NO.10254
おい。昨日の昼に投稿されたものがなんで昨日の夜に投稿されたものより上に上がってるんだよ。
解答がほしいから他のスレより目立たそうと思って上に上げてるんですか?いくす君。
君は一体誰と話しているんだって感じ。いきなりpizzaとかいう名前だしてきたし、
pizzaって誰。
pizzaってヤツと話しているなら掲示板じゃなくてそいつとメールでも何でも一対一で話して
くれないかな。
|
|
2007/8/10(Fri) 08:15:11|NO.10255
誰かが回答を書き込んだものの内容の間違いに気付いて消した・・・。
外人営業マン書き込みがあったので管理者が削除した・・・。
お盆で帰省したご先祖様の親切心。
と言う見方もありかも知れないのでなんとも?
ま、内容については俺わからないのでパス^^
おしえてあげてエラい人^^
|
|
2007/8/10(Fri) 08:56:11|NO.10257
私は何もしてないです・・・
|
|
2007/8/10(Fri) 09:02:25|NO.10258
連続ですいません
誤解されるかもしれないので
pizza様からのアドバイスを受けたのは結構前のことです(前の自分の日本語おかしいです。
今やっていることは WM_PRINT を使って自前でウィンドウキャプチャをすること です。
|
|
2007/8/10(Fri) 10:13:03|NO.10259
つーか俺的には、何が分からんって「VM_PAINTでキャプチャ」ってのが一番分からないんだが。
元記事読んだら「VM_PAINTでいけるかも?」とアドバイスされてるようだが
これは「VM_PAINTでキャプチャしろ」と言っているんじゃなくて、
HSPに画面の更新をさせる為にVM_PAINTメッセージを送れと言っているんじゃないか?
思うに、「一度HSPの画面を最前面に出して、画面全体の画像から必要部分を切り抜け」
とアドバイスされているのではないか。
大体どんなコードになってるかも分からんのでは何をどうアドバイスせよと言うのか。
まあ画面のキャプチャなんかした事ないので、VM_PAINTメッセージで出来るのを
俺が知らないだけかもしれんが。
なんせ俺は分からないので、俺の書き込みで終わらせてはいけないと思う有志の方、
頑張ってくれ。
|
|
2007/8/10(Fri) 10:19:10|NO.10260
なんかWMをVMとか書いている俺が居て、我ながら笑った(笑
|
|
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を送ると描画される・・・?
|
|
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
|
|
2007/8/11(Sat) 00:52:27|NO.10276
ウィンドウが WM_PRINT メッセージをどう処理するかは
アプリケーション(というかウィンドウプロシージャ)の
作者の自由です。
WM_PRINT メッセージを無視するように作られていれば
何の反応もありません。
(HSPのウィンドウは無視するように作られているようです。)
|
|
2007/8/11(Sat) 08:44:13|NO.10279
返答ありがとうございます。
私のしたいことはウィンドウのすべての要素(オブジェクト・描画)を動作しない形(画像として)
コピーすることです。
できればbuffer での画面をコピーしたいと思っています。
そして隠れている(メモリ上も)ウィンドウ に対して画面をコピーするときWM_PRINTメッセージが有効らしい っと考えているのですが、いかがでしょうか
|
|
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
俺的にはこれ以外のやり方は本当に知らんので。
|
|
2007/8/14(Tue) 21:27:43|NO.10397
> BitBlt を後からやると上書きされてしまい オブジェクトを隠してしまいます。
WM_PRINTを送ったウィンドウにWM_PRINTCLIENTが来た時に
BitBltしてみてください。(描画先HDCはwParamに入っています。)
|
|
2007/8/16(Thu) 13:08:39|NO.10424
返信ありがとうございます。
自前でやろうとしていましたが
pizza様のスプりクトが一番ですね
流石です…
前のスレッドで終わったことをぶり返してしまい申し訳なく思っております…
|
|
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

| |
|
2007/8/26(Sun) 01:12:11|NO.10678
Meで実行してみましたが、正常にコピー出来ているみたいです。
古いデザインになると言うことはXP以降だと思うのですが、
fさんが紹介されているPrintWindowでは出来ないのでしょうか?
すみません、解決策に心当たりが無いです・・・。
|
|
2007/8/26(Sun) 01:56:43|NO.10680
勝手な話かもしれません。
これは自分のポリシーですが、
"hsp自体はWin 98~vista に対応しているのになんでこのソフトは何でこのパソコンでできないんだ"
と思われたくないですし、自身の気持ちとして互換性を保ちたいのです(限界はあるんでしょうね)
まあ、今のところデザイン面での問題ですのであまり気にしないようにして作業を進めていきます。
pizza様感謝しています。
|
|
2007/8/26(Sun) 09:04:59|NO.10687
直接の解決につながる情報ではありませんが、一応報告いたします。
NO.10677のスクリプトがXPおよびVistaで正常に動作することを確認しました。OS依存の問題ではないようですね。
|
|
2007/8/26(Sun) 09:23:31|NO.10688
eller様、動作確認誠にありがとうございます。
枠があるオブジェクトの枠がやはりクラシックでしょうか?
|
|
2007/8/26(Sun) 09:34:02|NO.10689
いいえ、クラシックではなく新しいデザイン(Luna)になっています。2つの画面に表示される画像に、何の違いもありません。
|
|
2007/8/26(Sun) 10:15:05|NO.10690
|
|
2007/8/26(Sun) 11:02:04|NO.10691
その枠はオブジェクトが選択されているために表示される枠です。試しにボタンをクリックしてみてください。枠が消えるはずです。
|
|
2007/8/26(Sun) 11:40:23|NO.10692
|
|
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

| |
|
2007/8/26(Sun) 13:28:09|NO.10698
こればっかりはどうしようもないと割り切りますかね…
まぁ デザインの問題ですから動作には影響ないと願ってみます。
|
|
2007/8/26(Sun) 23:18:08|NO.10705
それはつまりHSPでいくら試行錯誤しようとも、windowsそのものの欠陥であるのでどうしようもないということですか…
sp3(2008年予定?)に期待…?
そういう専門の窓口ってあるものなのでしょうかね?
|
|
2007/8/27(Mon) 08:12:51|NO.10707
つーか、XP以前か以降可かを識別してWM_PRINTかPRINTWINDOWを使い分ければ済む事なんでね?
|
|
2007/8/27(Mon) 09:38:18|NO.10708
了解いたしました。
皆様ありがとうございます。
|
|