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


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0629
むーデスクトップの画面をHSPウィンドウで表示10未解決


むー

リンク

2009/6/29(Mon) 21:30:29|NO.26097

デスクトップに現在表示されている画面を
HSPのウィンドウに表示したいのですが、
調べて見つけたスクリプトはどれも画面に表示するまでに時間がかかってしまいます。

重くならずに表示する方法はないのでしょうか?
教えてください。



この記事に返信する


ki

リンク

2009/6/29(Mon) 22:47:39|NO.26102

普通に早いですが…

waitを消せば?



むー

リンク

2009/6/29(Mon) 22:48:25|NO.26103

スクリプトうpしてくれると助かります><



vine

リンク

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



vine

リンク

2009/6/30(Tue) 19:05:11|NO.26114

んー、処理は早いけど・・。(Vistaだからかな?)



inovia

リンク

2009/6/30(Tue) 19:05:17|NO.26115

>調べて見つけたスクリプトはどれも画面に表示するまでに時間がかかってしまいます。

すべてのウィンドウを最小化するところをばっさり削除するか、
複数回連続実行する場合に最小化処理を1度だけ実行されるようにすれば
早くなると思いますが。



ki

リンク

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
に書き換えて下さい。

エラーは起こりませんがとりあえず。



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