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


HSPTV!掲示板


未解決 解決 停止 削除要請

2015
0319
princeDWM サムネイル APIについて8解決


prince

リンク

2015/3/19(Thu) 14:37:13|NO.67979

Vistaから追加されたDWM APIを使って見ようと思い、
http://screwofhead.blog.fc2.com/blog-entry-2.html
などのサイトを見てこんなソースを組んでみましたが動きません…

#uselib "dwmapi.dll" #func DwmRegisterThumbnail "DwmRegisterThumbnail" int, int, var #func DwmUpdateThumbnailProperties "DwmUpdateThumbnailProperties" int, var #func DwmUnregisterThumbnail "DwmUnregisterThumbnail" int #define DWM_TNP_RECTDESTINATION 0x00000001 #define DWM_TNP_RECTSOURCE 0x00000002 #define DWM_TNP_OPACITY 0x00000004 #define DWM_TNP_VISIBLE 0x00000008 #define DWM_TNP_SOURCECLIENTAREAONLY 0x00000010 #uselib "user32.dll" #cfunc GetForegroundWindow "GetForegroundWindow" screen 0, 200, 200 objsize 200, 200 : button "アクティブウィンドウ捕獲", *start stop *start screen 0, 640, 480, screen_hide wait 100 hwndThumbnail = 0 ;アクティブウィンドウのハンドル取得 hwndTarget = GetForegroundWindow() ;表示する側・される側のウィンドウハンドルを渡す DwmRegisterThumbnail hwnd, hwndTarget, hwndThumbnail if stat != 0 : dialog "DwmRegisterThumbnail失敗" : end ;終了時にはサムネイルのハンドルを開放 onexit *exit ;プロパティ設定 dim ThumbnailProperties, 6 ;DWM_THUMBNAIL_PROPERTIES構造体 dim dest, 4 dest = 0, 0, 100, 150 ThumbnailProperties = DWM_TNP_RECTDESTINATION | DWM_TNP_VISIBLE | DWM_TNP_SOURCECLIENTAREAONLY, dest, NULL, 1, TRUE, FALSE DwmUpdateThumbnailProperties hwndThumbnail, ThumbnailProperties if stat != 0 : dialog "DwmUpdateThumbnailProperties失敗" : goto *exit gsel 0, 1 stop *exit DwmUnregisterThumbnail hwndThumbnail end
どこを直せばいいでしょうか?



この記事に返信する


cats

リンク

2015/3/19(Thu) 15:00:25|NO.67980

こちらが参考になるかもしれません。
http://hsp.tv/play/pforum.php?mode=all&num=67104



prince

リンク

2015/3/22(Sun) 08:40:45|NO.68020

ググってもC++の資料さえ少なかったものが過去ログにあるとは思いませんでした…
ありがとうございます。解決です。



tds12

リンク

2015/3/22(Sun) 09:19:36|NO.68022

ちなみにうまく行かなかった理由は、

・1
ThumbnailPropertiesの書き込み方がうまく行っていなかったことと、

//このように書き換えると良い ThumbnailProperties = DWM_TNP_RECTDESTINATION | DWM_TNP_VISIBLE | DWM_TNP_SOURCECLIENTAREAONLY, dest.0, dest.1, dest.2, dest.3,0,1<<24,1<<24,0
・2
hwndtargetが常に自分のウィンドウになっていて

//GetForegroundWindowの直後にこれを書き加えると //意図した動きになっていないことがわかる if hwndtarget == hwnd:dialog "アクティブウィンドウはわたしです"
循環参照を避けるエラーが起こっていたようです。
実際に、自分以外のトップレベルウィンドウを取得して見るとうまくいきます。

//これを#uselibの次の行に追加し、 #cfunc FindWindow "FindWindowA" sptr,sptr

//GetForegroundWindowを↓で置き換える //ためしに、デスクトップのアイコンが乗ったウィンドウを取得してみる hwndtarget = FindWindow("Progman",0)
直前までフォアグラウンドにあったウィンドウを取得する方法はあとで書くかもしれません。



prince

リンク

2015/3/22(Sun) 13:57:21|NO.68025

>>tds12さん
ご指摘ありがとうございます。

>>1
今まで構造体≒配列変数だと思っていました。
ビット演算はよくわからないのでとりあえずlpokeを使うことにします。

>>2
今は
http://monooki.ldblog.jp/archives/32180721.html
を使ってウィンドウ選択を実装しています。



tds12

リンク

2015/3/22(Sun) 14:46:48|NO.68026

>今まで構造体≒配列変数
大抵の場合、構造体もhspのint配列と同じ
4バイトごとの区切りになっているのですが、
透明度の部分が1バイトであるために
以降の要素が24ビットずつずれる特殊な構造体のようです。

>ウィンドウ選択を実装しています
この方法で取得されたウィンドウは
子ウィンドウである可能性があり
うまくいかないかもしれません。



prince

リンク

2015/3/22(Sun) 15:32:25|NO.68029

>>透明度の部分が1バイト
そのような情報はどこで調べられるのでしょうか?

>>子ウィンドウである可能性があり
親ウィンドウを取得するように改造してあります。



tds12

リンク

2015/3/22(Sun) 16:25:23|NO.68033

「{構造体名} structure msdn」という書式で検索します。
例:「DWM_THUMBNAIL_PROPERTIES structure msdn」
すると、大抵の場合トップに公式サイトが表示されます。
このページの「syntax」の「c++」の部分にある
「{」から「}」までの、行の左端にあるものがデータ型で、
そのデータ型を下のようなサイトと照らしあわせてサイズを求めます。
https://msdn.microsoft.com/en-us/library/cc230309.aspx
https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx
http://chokuto.ifdef.jp/urawaza/datatype.html



prince

リンク

2015/3/23(Mon) 12:41:12|NO.68046

ありがとうございます。調べてみます。



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