Hatena::Groupnadesiko

雪乃☆雫のなでしこ日和

2017-04-17

画像色取得が遅いよー(ToT)・・・とゆう話し(?)

| 09:32

 何気に触発されて、動体検知的なことを調べてみたのだけれど・・・

 ・・・なんだかさっぱり分からないヽ(;´Д`)ノ

 それでも、画素値分検出ってゆうのは、なんとかワタシの知恵でもできそうだ。

http://www2.wisnet.ne.jp/~daddy/LC3/CaptureAlgorithm.html

 定期的に静止画を取得して、の画像からピクセルごと色を取得して、前後の画像を比較。色が違っていたら、のピクセルは動いたよってことだね。

 出来そうだけど、画像色取得点取得)や点描画が遅すぎて、死にたくなる予感。

 以前、ノベルを作ってた時に、記事にはなってないけど、アルファ値付きのマスクでの合成が出来ないかと思って試作したんだけども、あまりの遅さに挫折したんだよね。

 なにしろ640*480の画像で、20~30秒もかかるんだもん!

 この問題と、セーブデータの仕様を考えるのがめんどーってゆうのが、ノベルに飽きちゃった原因ですかね;;;

(いやむしろ、完成させたところで、絵も描けなけりゃ文章も書けんだろ! って事実に気付いちゃった・・・w)


 それはさておき、動体検知です。

 方針としては、

1,タイマーして、クリップボードコピーでフレームを取得。

2,それを、イメージ0とイメージ1に、交互に振り分ける。

3,イメージからピクセルごと画像色取得して、値を配列に保持。

4,イメージ0とイメージ1の値を比較。

 ・・・的な?

 して、

5,感度値とゆうのを設定して、それよりが大きければ、のピクセルを検知と認定するらしい。

 動いていない背景も、ようく見たら結構ちらつきがあって、全く色が変化してないわけじゃないから、幅を持たすんだね。

6,閾値を設定して、検知となったピクセル数が閾値をえたら、の画像は動いたよと判断する。

 コレでちょこっと、監視カメラっぽい機能を搭載してみようと思う。

 よくある、動くモノが映ったらシャッターを切ったり、メールで送ったり、録画を保存したりする的なコトだね。とりあえず簡単に、静止画保存を呼び出す感じで。


 さらに・・・加えて、動いたところをモニターしたい(?)とゆう野望なのです。

 それをリアルタイムでやろうとすると、コレがまた予想どうりなかなかキビシイ。

 たぶんだけど、なでしこの点取得画像色取得)と点描画は、WindowsAPIのGetPixelとSetPixelが元になってると思われ、コレ自体が遅いとゆう評判なので、もはやどうしようもないっぽいんですよね~(--;

 何か、他に手立ては無いのかなあ・・・

 とりあえず、画像色取得でやるとすると、高速化するには画像を縮小してピクセル数を減らすしかない

 3の前にイメージを縮小するとして、縮小すると精度が下がる。速度を取るか、精度を取るかの二択・・・でもないけど、妥協点を見いださなきゃならいって話になる。

 これは、縮小率を色々変えて、お試ししてみるしかないね。

#-----------------------------------------------------------
精度=20
精度=精度/100

動体検知モニターとはフォームこれについて
  可視はオン。
  スタイルは「枠固定」
  オフに最大化ボタン有効変更。
  タイトルは「動体検知的な?」
  クライアント幅はCW幅。
  クライアント高さはCW高さ。

表示用とはイメージこれについて
  可視はオン。
  親部品は動体検知モニター。
  幅はCW幅。
  高さはCW高さ。
  位置は「0,0」
表示用を黒色画面クリア。

2
  比較用[回数-1]をイメージとして作成。
  比較用[回数-1]→可視はオフ。
  比較用[回数-1]→位置は「0,0」
  比較用[回数-1]→幅はCW幅。
  比較用[回数-1]→高さはCW高さ。

Tとはタイマーの値はフレームレート。
の時満ちた時は~
  C=C+1。D=0。
  CWハンドルをクリップボードコピー。
  比較用[C%2]→画像は「クリップボード」。
  比較用[C%2]を画像グレイスケール。
  比較用[C%2]をCW幅*精度,CW高さ*精度へ画像高速リサイズ。
  yで0からCW高さ*精度-1まで繰り返す。
    xで0からCW幅*精度-1まで繰り返す。
      比較用[C%2]のx,yから画像色取得。
      P¥(C%2),D=それ/$10000を切り下げ。
      D=D+1。
  表示用の画像は「クリップボード」。
#-----------------------------------------------------------

 精度は、何パーセントまで画像を縮小するかの値となってます。

 うーん、画像色取得を終えて、単にクリップボードの画像を表に転送しているだけなんだけどね~。

 ストレス無く動くと言ったらせいぜい20%・・・(´д`;

 リアルタイム感を出そうと思ったら、10%とか・・・Σ(゜д゜;

 の上、動いたピクセルに点描画かなんかすることを考えたら・・・あああ(ToT)

 点描画より四角の方が早いなんてオチはないよね?(汗)

 いや、どっちにしても、画像色取得が最大のネックなんだから、しようがない


 しかしまー、動いたよ→静止画保存・・・くらいなら、出来そう感があるんで、とりあえずはそれかな;;;

 この場合は、細かい動きは無視して、大きく動くものを侵入者(?!)としてとらえるわけだから、ちっちゃこい画像からの検出でもいけそう(たぶん)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170417

2017-04-15

ステータスをゲットしてみる

| 14:37

 実際に、キャプチャーウィンドウのステータスをゲットしてみる。

 同じようにやれば出来るハズ~・・・なんだけど、なかなかそうは問屋が卸さなかった><;


 さて、CAPSTATUS構造体は、何だかわからんものが多いけど、とりあえず幅と高さしか使う予定無いから、他の部分はコピペしただけ~;

 でもたぶんここは問題ないはず。

#https://msdn.microsoft.com/en-us/library/windows/desktop/dd756939(v=vs.85).aspx
■CAPSTATUS
 ・幅
 ・高さ
 ・fLiveWindow
 ・fOverlayWindow
 ・fScale
 ・ptScroll
 ・fUsingDefaultPalette
 ・fAudioHardware
 ・fCapFileExists
 ・dwCurrentVideoFrame
 ・dwCurrentVideoFramesDropped
 ・dwCurrentWaveSamples
 ・dwCurrentTimeElapsedMS
 ・hPalCurrent
 ・fCapturingNow
 ・dwReturn
 ・wNumVideoAllocated
 ・wNumAudioAllocated

 しかし、まずは早くもPACKエラー発生(´д`;

PACK(CAPSTATUS,S,"UINT,UINT,BOOL,BOOL,BOOL,POINT,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")

 エラーの内容としては、こんな感じ。

[エラー] 6,ステータスをゲットしてみる.nako.bak(233): 関数UNPACK』の
実行中にエラーが起きました。PACK規則の設定に失敗。構造体の定義エラー
「POINT」は未定義(関数)

 これまた意味も分からずコピペしてきただけだもんね~。

 でも、UINTやらBOOLなどもなでしこで使える型に単純置換してくれるらしいコトだったので、このままで行けるかと思ったのにぃ~。

https://nadesi.com/doc/system/sys-1-DLL-WindowsAPI.htm#head1

 PナントカはPOINTERにとゆうことだったので、

PACK(CAPSTATUS,S,"UINT,UINT,BOOL,BOOL,BOOL,POINTER,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")

 としてみたら、通ったっぽい。

 次にいよいよ「WM_CAP_GET_STATUS」のメッセージを送信しようとしたところ、またまた、GetWindowRectの時にはなかった問題が発生。

#https://msdn.microsoft.com/en-us/library/windows/desktop/dd743906
!WM_CAP_GET_STATUS=$400+54         # キャプチャウィンドウのステータスを取得します。

 二つ目のパラメーターは、同様に「POINTER(S)」でいいとして・・・

 一つ目のパラメーター「sで参照される構造体のサイズ(バイト単位)」・・・ってなんすかヽ(;´Д`)ノ

 C(?)とかだと「sizeof」なる関数があって取得出来るらしいんだけど・・・ああ、マジックナンバーってそうゆうことか・・・

(だんだんナゾな独り合点が多くなっていきますが、気にしないで!www)

 コレはどうやら、SHORTが2バイトであったり、DWORDやLONGが4バイトであったり、LONGLONGが8バイト・・・的なコトの合計らしい。

 とりあえず・・・大は小を兼ねるのかどうかすら分からんけど、仮に144とか入れてみる。

メッセージ送信(ハンドル,WM_CAP_GET_STATUS,144,POINTER(S))    # Size=バイト単位。S=CAPSTATUS構造体へのポインタ。

 ところが度は、UNPACKのところでエラーが出てしまう。

[エラー] 6,ステータスをゲットしてみる.nako.bak(233): 関数UNPACK』の
実行中にエラーが起きました。PACK変数代入失敗。モジュール 'dnako.dll'
 のアドレス 0228B034 でアドレス 00000000 に対する読み込み違反がおきました。(関数)

 読込違反とか、マジでキライさ! 何言ってんのか分かんないんだもんヽ(;´Д`)ノ

 しかし、「PACK変数代入失敗」とか言ってるので・・・またまた型の指定とかなのか。PACKでは通ったのに、まだダメなんすか。

 だいたい、もの型の意味がわかんないから、9種類のうちのどれに置換されてんのかも分からん;

 もー半ばヤケで、

UNPACK(S,CAPSTATUS,"long,long,long,long,long,long,long,long,long,long,long,long,long,long,long,long,long")

 こんなことしてみたら、なんと動いた! えー;;;

 動いたことだし、このままでもいいかと思ったんだけど(こら;)、いちおういっこいっこ、どれが良くないのか確認してみたら、またもや6番目のPOINTERだった。えええ~??

 やっぱ、ぽいんたぁはキモンなのか。

 鬼門には近づきたくないので、深く追求せず、このようにしておく(爆)

UNPACK(S,CAPSTATUS,"UINT,UINT,BOOL,BOOL,BOOL,long,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")

 まあ・・・いちおうコレでステータスは取得でき、キャプチャーウィンドウの幅と高さが分かるようになりました。

 ところで、全部LONGで行けるのなら、マジックナンバーは18*4=72で良いのではないかと思ったんだけどダメで、ステータスが0になってしまった。むむむ~;

 地道に1づつ手動で(爆)増やしていってみたところ、76で行けました。

 でっ、とりあえずこんな感じ。

#-----------------------------------------------------------
CWとはCAPSTATUS。
CWハンドルのステータス取得。
#-----------------------------------------------------------
!WM_CAP_GET_STATUS=$400+54         # キャプチャウィンドウのステータスを取得します。
●ステータス取得(ハンドルの)
  PACK(CW,S,"UINT,UINT,BOOL,BOOL,BOOL,POINTER,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")
  メッセージ送信(ハンドル,WM_CAP_GET_STATUS,76,POINTER(S))    # Size=バイト単位。S=CAPSTATUS構造体へのポインタ。
  UNPACK(S,CW,"UINT,UINT,BOOL,BOOL,BOOL,long,BOOL,BOOL,BOOL,DWORD,DWORD,DWORD,DWORD,HPALETTE,BOOL,DWORD,UINT,UINT")
#-----------------------------------------------------------

 ここまでくれば、あとはそれ母艦に反映してやるだけ。

#-----------------------------------------------------------
*ウィンドウサイズ設定
  CWハンドルのステータス取得。
  母艦のクライアント幅はCWの幅
  母艦のクライアント高さはCWの高さ
  母艦中央移動。
#-----------------------------------------------------------

 起動時と、ビデオ形式のダイアログを開いた後に、ウィンドウサイズ設定してやればOK。

#-----------------------------------------------------------
!WM_CAP_DLG_VIDEOFORMAT=$400+41    # ビデオ形式を選択できるダイアログボックスが表示されます。
●ビデオ形式ダイアログ
  メッセージ送信(CWハンドル,WM_CAP_DLG_VIDEOFORMAT,0,0)
  ウィンドウサイズ設定。
  CWハンドルに0,0,母艦のクライアント幅,母艦のクライアント高さを窓ハンドル位置サイズ設定。
#-----------------------------------------------------------

 ・・・なんかまたまた大事なことを棚上げした気がするけど、ここまで><;

うぇいくうぇいく2017/04/15 21:18念のため。

https://msdn.microsoft.com/ja-jp/library/8kk2sy33.aspx
(型名まで日本語に訳されてしまっているのは誤訳。)

POINTは、構造体を用いた型で、2つのlongにより座標を折らわすのに使われます。
(RECTが四角を表す構造体を用いた型)

ポインターなら、LPRECTや、LPPOINTのように、元の型名の前にLPを付けた型名になっているはずです。
(LPはlong pointerの略。たぶん。)

雪乃☆雫雪乃☆雫2017/04/16 00:21うぇいくさま、ありがとうございます~!!
POINTとPOINTERは違ったんですね(^▽^;
おおぉ、そして、おかげさまでナゾが一つ解明しました。
なんで72じゃなく76になるのかさっぱり分からんと思っていたのですが、longが二つ分だったのですね!
それにしても、構造体の中にまたこーぞーたい・・・あああ(@_@)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170415

2017-04-12

こーぞーたいを学ぶよ!

| 20:52

 こーぞーたいだのぽいんたあだのって・・・なんかソレ系は、非常に敷居が高い気がして、なるべく避けて通るようにしていた命題なんですが・・・

 なんでいきなりーゆうことになったかと言うと、例のカメラですね。

 またちょっと目をしながらVFWのメッセージを眺めていて・・・

 ちょっと、ダイアログを出してみたわけですよ。これは、取りあえず送れば出る簡単なメッセージなので。

 出せるダイアログは、「VIDEOFORMAT(ビデオ形式)」「VIDEOSOURCE(ビデオソース)」「VIDEODISPLAYT(ビデオ出力)」「VIDEOCOMPRESSION(圧縮器)」の4種類あって、実際に出せるかどうかは、カメラに依存しているラシイです。

#-----------------------------------------------------------
!WM_CAP_DLG_VIDEOFORMAT=$400+41
●ビデオ形式ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOFORMAT,0,0)

!WM_CAP_DLG_VIDEOSOURCE=$400+42
●ビデオソースダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOSOURCE,0,0)

!WM_CAP_DLG_VIDEODISPLAY=$400+43
●ビデオ出力ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEODISPLAYT,0,0)

!WM_CAP_DLG_VIDEOCOMPRESSION=$400+46
●圧縮器ダイアログ(ハンドルで)
  メッセージ送信(ハンドル,WM_CAP_DLG_VIDEOCOMPRESSION,0,0)
#-----------------------------------------------------------

 うちで出せたのは、ビデオ出力を除く3種類で、しかし、圧縮器とは何なのか全く分からないので無視するとして(えっ)ビデオ形式や、ビデオソースは、(別に使わないけど)ちょっとあると、本物っぽくて(?)いいかなあと思ったのが運の尽き!

 ビデオソースの方は、特に問題ありません(たぶん)

 問題は、ビデオ形式で、解像度が変えられるわけなんだけど・・・ビデオの解像度は変わりますが、当然のことながら、母艦のサイズは変わらないので、640*480の母艦の左上に、ちっちゃこいビデオ映像が表示されるとゆーことになってしまいます。

 ビデオ形式ダイアログで解像度を変更したら、変更したキャプチャーウィンドウのサイズを、母艦のサイズに反映しなくちゃいけません。

 しかも、この解像度変更は、プログラムを終了しても元に戻らんので、次起動時も見事にの状態で、起動して来ちゃうんですよね><

 起動時の母艦のサイズも、本当は、640*480で決め打ちではダメで、キャプチャーウィンドウのサイズに合わせてやらなくちゃいけなかったんです。

 ちょっと現実逃避しようと思って別のコトしたら、こっちでもまたキビシイ現実に直面するとゆう、いつものパターン><

(ちょっとリバーシについて考えはじめたのが違いの元ってゆう・・・ミニだかマックスだかアルファだかベータだか、なんかもーわけ分からんヽ(;´Д`)ノ ・・・やっぱ初心で、とりあえずはしりとりかな;)


 さてこでのキャプチャーウィンドウのサイズを知るには、「WM_CAP_GET_STATUS」で、キャプチャーウィンドウのステータスをゲットしなくちゃいけない。一体どこからゲットするかというと、「CAPSTATUS」とゆう構造体からだよって話なんです。

 winAPIでなんかかんかする場合、SETする系はたいてい、ちゃんと送りさえすればこちらが特に意識しなくても値をセットしてくれて動くんだけど、GETするにはどうやら構造体から逃れられないっぽいため、これまではつとめてGETしないよう心がけていたのです(なにそれ;)

 だって、も、こーぞーたいってなんすか・・・。しくしくしく。


 うっすらと分かっているのは、

・目的の構造体と同じ構成の、なでしこのグループを作る。
・PACKグループを構造体にする。→APIで操作。
・UNPACKで構造体をグループにする。→なでしこで操作。

 ・・・的な???

 以前やったジョイパッドを使うAPIのプログラムで使われていて、何の呪文だかさっぱり分からんと思い調べた結果、こんな感じラシイと分かったものの、理解するには到らなかったんです;;;

 しかしまーワタシも近頃は色々ひらめいて、だいぶ賢くなってきてますからっ!

 コレを使って、以前スクリーンセーバーの時に、なんだか分からんと無視した「GetWindowRect」をやってみようと思う。

 ばいなりしゅとくやかくほはいまだよく分からないけど、とりあえずPACKUNPACKで同じコトができーな気がしてきた☆

#-----------------------------------------------------------
#まずはGetWindowRectを使えるようにする。
#https://msdn.microsoft.com/ja-jp/library/cc364769.aspx
#指定されたウィンドウの左上端と右下端の座標をスクリーン座標で取得します。
#スクリーン座標は、表示画面の左上端が (0,0) となります。
#-----------------------------------------------------------
●WinRect取得(hWnd,lpRect)=DLL("user32.dll",
"BOOL GetWindowRect(
HWND hWnd,      // ウィンドウのハンドル
LPRECT lpRect   // ウィンドウの座標値
)")

#-----------------------------------------------------------
#構造体の内容でグループを作る。
#https://msdn.microsoft.com/ja-jp/library/a5ch4fda.aspx
#-----------------------------------------------------------
■WinRect
 ・左
 ・上
 ・右
 ・下

#-----------------------------------------------------------
#グループを構造体に。
#(型ってのがまた、ひとつ分からんケド、これはLONGラシイ。)
#-----------------------------------------------------------
PACK(WinRect,S,"LONG,LONG,LONG,LONG")

#-----------------------------------------------------------
#引数は、パックした構造体へのポインター。
#(変数Aの保持している生データへのポインタ・・・なんて言われても
#ぜんっぜんわかんないけど、深く考えず「POINTER」を使えばOK;)
#-----------------------------------------------------------
WinRect取得(母艦のハンドル,POINTER(S))
それ言う。  # 関数成功すると、0 以外の値が返ります。関数失敗すると、0 が返ります。

#-----------------------------------------------------------
#構造体をグループに。
#-----------------------------------------------------------
UNPACK(S,WinRect,"LONG,LONG,LONG,LONG")

#-----------------------------------------------------------
#(WinRectの右-WinRectの左)と(WinRectの下-WinRectの上)が
#母艦の幅と高さと同一ならば、正しく取得されており成功です。
#-----------------------------------------------------------
母艦の幅を表示母艦の高さを表示改行表示。
(WinRectの右-WinRectの左)を表示。
(WinRectの下-WinRectの上)を表示改行表示。

#ちなみに、「の」でも「.」でもイイっぽい。
WinRectの左を表示。
WinRect.上を表示。
WinRectの右を表示。
WinRect.下を表示。
#-----------------------------------------------------------

 でっ、できた!!(喜)

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170412

2017-04-06

取りあえず辞書切り替えを試すよ!

| 15:03

 んなこんなで(?)なんとかとりあえず、ようやく辞書の切り替えができるようになったので、実装。

 単語リストは複数同時に使用することが出来るのだけど、はまあお試しで、完全にいっこづつ切り替える感じに。

#-----------------------------------------------------------
*辞書切り替え(DICに)
  辞書をJulius文法無効化。
  DICをJulius文法有効化。辞書=DIC。
  返事辞書=「{DIC}.adic」を開いてTSV取得。
  返事辞書からコマンドリスト作成。
  1秒待つ。
  塗り色は情報表示色。
  コマンドリストを科白表示。

*コマンドリスト作成(Aから)
  コマンドリスト=「【コマンド】{改行}」
  Aを反復
    もし対象¥0の1文字左部分=「@」でなければ、
      「 ・{対象¥0}」をコマンドリスト一行追加。
#-----------------------------------------------------------

 コマンドリスト作成は、これまで手動で

「【コマンド】{改行} ・ナコ様{改行} ・ナコ{改行} ・バイバイ」と科白表示

 などとしていたのを、辞書から単語を抜いて自動生成するようにしたもので、表示したくない語については先頭に「@」を付けとく仕様にした。

 「@ナコ」などとしておけば、コマンドの一覧には表示されないけど、うっかり呼び捨てすると怒ってくる的な(^m^)

 まあ、コマンドを表示する自体が、お試しの機能だけどね。


 でっ、いちおう「遊ぼう」とか「遊んで」などと言うと、ゲームのリスト表示される的な。

#-----------------------------------------------------------
*コマンド実行(Sで)
 辞書で条件分岐
  初期辞書ならば、Sで条件分岐
    「バイバイ」ならば終了処理。
    「遊ぼう」ならば、「game」に辞書切り替え。
  「game」ならば、Sで条件分岐
    「やめた」ならば、初期辞書に辞書切り替え。
    「@戻るならば、初期辞書に辞書切り替え。
    「サイコロ」ならば、
      「..\..\02_サイコロ\36\36Thirty-six_1_031.nako」を起動。
      ナコ様の可視はオフ。科白非表示。1秒待つ。
      WHD=「36(Thirty-six)」を窓ハンドル検索。
        (WHDの窓ハンドル表示状態=オン)の。
        「nako_sama」に辞書切り替え。
        ナコ様の可視はオン。
    「リバーシ」ならば、
      「{PROGRAMFILESパス}\nadesiko_lang\sample\ゲーム\なでリバーシ.nako」を起動。
      科白非表示。1秒待つ。
      WHD=「*)の番です」を窓ハンドル検索。
        (WHDの窓ハンドル表示状態=オン)の。
        「nako_sama」に辞書切り替え。
#-----------------------------------------------------------

 「サイコロ」と「リバーシ」とほぼ同じコードが並んでるけど、気にしないで!

 希望どうりに辞書が切り替わったり、プログラムを起動したりできることを確認しました。

 ああ~、ひらめいた!

 リバーシなら、どうせなら音声で、ブラインドで打てるようにしたいね。

 ずっと以前、相棒で右京さんがAIとチェスをやってたけど、なんかかっこいいよね~♪

 まあ、ワタシの方にの能力が無いんだけど;;;;;

 しかも・・・

 コンピューターが何かを考えるようなゲームは、まだ作ったことがないんだよね~。

 前になでリバーシを眺めたけど、なんだかよく分かんなかったし><

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170406

2017-04-04

画面をクリップボードにコピー

| 15:55

 これまで、カメラの映像の静止画を取得するために使っていた窓内側キャプチャですが、コレがどうもなかなかの遅さですね。

 ワタシは別に、リアルタイムの処理を行おうとかしてないから、困らないけどねw

 でも、速度はともかく、窓内側キャプチャだと、フルスクリーンにしている時に行うと、の画面に合わせて引き延ばされた画像が保存されてしまうんだよね。

 の方がイイという場面もあるかも知れないけど、どっちかっていうと、拡縮やトリミングは後からでも出来ることだから、本来のとうりの絵を取れた方がよさげ。

 なにしろレターボックスにしてたら、の枠まで入っちゃうんだもんね;

 さてこで発見してきたのが、画面をクリップボードコピーするメッセージ。

 正確には「ビデオフレームバッファと関連するパレットの内容をクリップボードコピーします。」とゆうことなんだけど、なんだかよく分からん;

 でも取りあえずコレで、キャプチャーウィンドウの内容がクリップボードに入り、ペイントとかに貼り付けることも出来ました!

#-----------------------------------------------------------
!WM_CAP_EDIT_COPY=$400+30    # 画面をクリップボードコピー。
●クリップボードコピー(ハンドルを)
  メッセージ送信(ハンドル,WM_CAP_EDIT_COPY,0,0)
#-----------------------------------------------------------

 クリップボードの画像をイメージ部品に取得するのは、イメージ部品の画像を「クリップボード」と指定します。(「」が必要

#-----------------------------------------------------------
*静止画保存
  ファイル名は「{今日} {}」を「yyyymmdd_hhnnss」に日時形式変換。
  ファイル名は「{デスクトップ}{ファイル名}.png」
  CWハンドルをクリップボードコピー。
  処理用の画像は「クリップボード」
  処理用をファイル名へ画像保存。
#-----------------------------------------------------------

 一見これまでと同じように動作しますが、フルスクリーンの場合には、元のキャプチャーウィンドウのサイズどうりの静止画が保存されるようになりました。

 して、どうやらこっちの方が、かなり高速な印象。

トラックバック - http://nadesiko.g.hatena.ne.jp/snowdrops89/20170404