|
|
2009/6/29(Mon) 21:30:29|NO.26097
デスクトップに現在表示されている画面を
HSPのウィンドウに表示したいのですが、
調べて見つけたスクリプトはどれも画面に表示するまでに時間がかかってしまいます。
重くならずに表示する方法はないのでしょうか?
教えてください。
|
|
2009/6/29(Mon) 22:47:39|NO.26102
普通に早いですが…
waitを消せば?
|
|
2009/6/29(Mon) 22:48:25|NO.26103
スクリプトうpしてくれると助かります><
|
|
2009/6/30(Tue) 16:41:51|NO.26112
>調べて見つけたスクリプトはどれも
いや、だからそっちが先にうpしてくれないとわからないよ?
|
|
2009/6/30(Tue) 18:53:32|NO.26113
vineさん
そうですか。
#module
;▼必要となるAPIや定数の定義
#uselib "user32.dll"
#func keybd_event "keybd_event" int,int,int,int
#cfunc GetSystemMetrics "GetSystemMetrics" int
#cfunc GetDesktopWindow "GetDesktopWindow"
#cfunc GetWindowDC "GetWindowDC" int
#func GetWindowRect "GetWindowRect" int,int
#func ReleaseDC "ReleaseDC" int,int
#func InvalidateRect "InvalidateRect" int,int,int
#func OpenIcon "OpenIcon" int
#uselib "gdi32.dll"
#cfunc CreateDC "CreateDCA" var,int,int,int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#func DeleteDC "DeleteDC" int
#define KEYEVENTF_KEYUP $00000002
#define SM_CXFULLSCREEN $00000010
#define SM_CYFULLSCREEN $00000011
; nMode
; ----------------------------------------------------------------
; 0 : クライアント領域のみ (タスクバー領域を含めない)
; 1 : 非クライアント領域を含める (タスクバー領域を含む)
#deffunc deskcapt int prm1
nMode = prm1 : if (nMode<=0)|(nMode>1) : nMode=0
;▼すべてのウィンドウを最小化
keybd_event 91, 0, 0, 0
keybd_event 77, 0, 0, 0
keybd_event 91, 0, KEYEVENTF_KEYUP, 0
keybd_event 77, 0, KEYEVENTF_KEYUP, 0
;▼タイミング
wait 50
;▼クライアント領域のみ
if nMode==0 {
;クライアントサイズ取得
w=GetSystemMetrics(SM_CXFULLSCREEN)
h=GetSystemMetrics(SM_CYFULLSCREEN)
;デスクトップのHDC取得
class="DISPLAY"
WDc=CreateDC(class,0,0,0) : if WDc==0 : return -1
;画面コピー
BitBlt hdc,0,0,w,h,WDc,0,0,$00CC0020
;デスクトップのHDCを解放
DeleteDC WDc
}
;▼非クライアント領域を含める
if nMode==1 {
;デスクトップのハンドル取得
Deskhwnd=GetDesktopWindow()
if Deskhwnd==0 : return -1
;デスクトップのHDC取得
WDc=GetWindowDC(Deskhwnd)
if WDc==0 : return -1
;タスクバーを含めたサイズを取得
dim rc,4 : GetWindowRect Deskhwnd,varptr(rc)
w = rc(2)-rc(0) : h = rc(3)-rc(1)
;画面コピー
BitBlt hdc,0,0,w,h,WDc,0,0,$00CC0020
;デスクトップのHDCを解放
ReleaseDC Deskhwnd,WDc
}
;▼画面更新
InvalidateRect hwnd,0,1
;▼画面(最小化したHSP window)を復帰
OpenIcon hwnd
return 0
#global
;***** sample *****
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int
#cfunc GetWindowLong "GetWindowLongA" int,int
#define GWL_STYLE -16
#define overrapwin SetWindowLong hwnd,GWL_STYLE,$14CF0000
screen 0,ginfo(20),ginfo(21),2
width 640,480 : overrapwin : gsel 0,1
deskcapt 0
stop

| |
|
2009/6/30(Tue) 19:05:11|NO.26114
んー、処理は早いけど・・。(Vistaだからかな?)
|
|
2009/6/30(Tue) 19:05:17|NO.26115
>調べて見つけたスクリプトはどれも画面に表示するまでに時間がかかってしまいます。
すべてのウィンドウを最小化するところをばっさり削除するか、
複数回連続実行する場合に最小化処理を1度だけ実行されるようにすれば
早くなると思いますが。
|
|
2009/6/30(Tue) 19:09:00|NO.26116
とりあえず、もう少し勉強してからの方がいいと思います。
|
|
2009/7/2(Thu) 18:01:01|NO.26159
あーいえ、そうではなくてですね。
説明が悪かったんですが、
この処理をループしても気にならないくらい
の速さを出したいんです。
|
|
2009/7/4(Sat) 00:46:49|NO.26189
恐らくグラフィックボードの性能が一番のネックでしょう。
#module
;▼必要となるAPIや定数の定義
#uselib "user32.dll"
#func keybd_event "keybd_event" int,int,int,int
#cfunc GetSystemMetrics "GetSystemMetrics" int
#cfunc GetDesktopWindow "GetDesktopWindow"
#cfunc GetWindowDC "GetWindowDC" int
#func GetWindowRect "GetWindowRect" int,int
#func ReleaseDC "ReleaseDC" int,int
#func InvalidateRect "InvalidateRect" int,int,int
#func OpenIcon "OpenIcon" int
#uselib "gdi32.dll"
#cfunc CreateDC "CreateDCA" var,int,int,int
#func BitBlt "BitBlt" int,int,int,int,int,int,int,int,int
#func DeleteDC "DeleteDC" int
#define KEYEVENTF_KEYUP $00000002
#define SM_CXFULLSCREEN $00000010
#define SM_CYFULLSCREEN $00000011
; nMode
; ----------------------------------------------------------------
; 0 : クライアント領域のみ (タスクバー領域を含めない)
; 1 : 非クライアント領域を含める (タスクバー領域を含む)
#deffunc Initcapt int prm1
nMode = prm1 : if (nMode<=0)|(nMode>1) : nMode=0
if nMode ==0{
;クライアントサイズ取得
w=GetSystemMetrics(SM_CXFULLSCREEN)
h=GetSystemMetrics(SM_CYFULLSCREEN)
;デスクトップのHDC取得
class="DISPLAY"
WDc=CreateDC(class,0,0,0) : if WDc==0 : return -1
}
if nMode ==1{
;デスクトップのハンドル取得
Deskhwnd=GetDesktopWindow()
if Deskhwnd==0 : return -1
;デスクトップのHDC取得
WDc=GetWindowDC(Deskhwnd)
if WDc==0 : return -1
;タスクバーを含めたサイズを取得
dim rc,4 : GetWindowRect Deskhwnd,varptr(rc)
w = rc(2)-rc(0) : h = rc(3)-rc(1)
}
;▼すべてのウィンドウを最小化
keybd_event 91, 0, 0, 0
keybd_event 77, 0, 0, 0
keybd_event 91, 0, KEYEVENTF_KEYUP, 0
keybd_event 77, 0, KEYEVENTF_KEYUP, 0
;▼タイミング
wait 50
;▼画面(最小化したHSP window)を復帰
OpenIcon hwnd
#deffunc deskcapt
;▼クライアント領域のみ
if nMode==0 {
;画面コピー
BitBlt hdc,0,0,w,h,WDc,0,0,$00CC0020
}
;▼非クライアント領域を含める
if nMode == 1{
;画面コピー
BitBlt hdc,0,0,w,h,WDc,0,0,$00CC0020
}
;▼画面更新
InvalidateRect hwnd,0,1
return 0
#deffunc ReleaseHDC onexit
if nMode == 0:DeleteDC WDc
if nMode == 1:ReleaseDC Deskhwnd,WDc
return
#global
;***** sample *****
#uselib "user32.dll"
#func SetWindowLong "SetWindowLongA" int,int,int
#cfunc GetWindowLong "GetWindowLongA" int,int
#define GWL_STYLE -16
#define overrapwin SetWindowLong hwnd,GWL_STYLE,$14CF0000
screen 0,ginfo(20),ginfo(21),2
width 640,480 : overrapwin : gsel 0,1
Initcapt 1
repeat
deskcapt
await 1
loop
サイズ取得などの最初にやっておく処理だけ先にやってしまって、HDCの開放を最後のOnexitに回してみました。
これで少しは速くなりますが、正常に終了できないと酷いことになるかもしれません。

| |
|
2009/7/4(Sat) 00:49:31|NO.26190
すみません。訂正です。
OpenIcon hwnd
#deffunc deskcapt
の箇所を
OpenIcon hwnd
return
#deffunc deskcapt
に書き換えて下さい。
エラーは起こりませんがとりあえず。
|
|