忍者ブログ
サブタイトル:「mer2のマイノリティ・レポート(笑)」 --- 最近忍者ブログの仕様が変わったようで、一部の画像が見えなくなってますが、画像のURLコピペで見られます。(どうしよう困ったな) --- ご用件など、ございましたらtwitterまでどうぞ。
[1] [2] [3] [4] [5] [6]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



  できればプログラミング関連は時間が有る時にまとめて一気に取り掛かりたい人なんですが、最近そうも言ってられなくなってきた。全然まとまった時間が無い。後回しのネタがどんどん溜まっている。
  という訳で、他の事はほっぽらかして久しぶりにプログラム書いてみました。でも時間があんまし無かったから、お遊びプログラム作って終っちゃった。

今日のお遊びプログラム (つまんないよ)

  何故コマンドプロンプトベースかというと、ウィンドウズの文字表示の勉強をしている時間が無いからだ。コマンドプロンプトベースでウィンドウ表示できないかなとやってみたら、結構できちゃうのね。ああおもしろい。ビルドもコマンドラインからいけるぞ。
  当初はあんなことをするプログラムを作ろうとしていたらどんどん横道に逸れてしまってこうなってしまったのですが、やっていたらああいうことにも応用できそうな気がしてきたぞ。やっぱりプログラミングは楽しいね。
  よし、これからは地道なmer2さんを目指すのだ。(多分無理)

今回の参考:
標準 Windows API
  もうここに頼りっぱなし。
全画面をクリップボードにコピーする
  また参考にしちゃった。今回はクリップボードじゃないけど。

インスタンスハンドルと、インスタンス
自プロセスの HINSTANCE を得る方法

ウィンドウの作成
  クラス名を自前で定義すると、即落ちる。なんで?
PR


多分あと単行本10冊分ぐらいは続くね。

  以下はただのメモだ。
  ちょっとこんなことをやっていた。動画フォーマットを変換するバッチファイル。動画ファイルをバッチファイルにドロップするだけ。後は画面の指示に従えばいい。

その1
  あくまでffmpegベースなので、ffmpegで対応しているフォーマットじゃないと変換できません。mpeg2tsとwmvはなんとなく付けました。いーかげんです。勉強します。
  とりあえず作ってみてRe:Qさんに試してもらったら、日本語ファイル名で障害が出る事が判明した。私のようなパソコンヲタクなジジイはファイル名に2バイト文字なんて絶対に使わないので、そんな事はちっとも気付かなかっった。やっぱりテストはしてもらうもんです。

その2
  ビットレートも指定できるようにしてみた。バッチファイルの機能だけじゃどうにもならないので、こすい真似でどうにかしてます。ああ、MS-DOS楽しー。
  ついでに日本語問題にも対応してみた。実は日本語のせいじゃなくて、半角スペースが悪さしていたのかもしれない。たいがいはファイル名を「"」でくくれば通るんだけど、forコマンドのファイル名の部分だけはこの方法だと動作がおかしくなってしまう。悩んだ末に卑劣な手段で切り抜けた。ちょっと悔しい。
  バッチファイルを単独で起動させてしまった時のためにエラー処理を
if "%1"=="" echo エラー
(バッチファイルにパラメーターが付いてない時はエラー)
みたいなかんじで入れておいたんだけど、これだとファイル名に半角スペースが入ったファイルをドロップしただけで即バッチファイルが異常終了してしまう。これは驚いた。これもこすい手段で回避。


追記:もうちょっとまともになりました


  こちらで紹介したUScreenCaptureというスクリーンキャプチャソフトですが、ReadMe.txtを読んでみるとCOMインターフェイスって奴を使って自作のプログラムから利用できるようになっているらしいんですよね。こりゃあ楽しそうだってんっで温COM知新とか読んで勉強してみたんですが、当時はさーっぱり理解できなくて諦めてしまっていたんです。

  その後、こんな事やってみたりしたらちょっとだけCOMって奴が分ってきた気がしてきたので、改めて温COM知新さんとこのこの記事を読んでみると、あら結構分かる。
  という訳でこことかここを参考にしてプログラム組んでみたんですよ。(なんのかんの言って、私に理解できる解説がしてあるサイトは温COM知新さんとこしか見つかりませんでした。)

  こんなんなりました
  CLSIDはフルバージョンのwindows SDKに入ってるOleView.EXEで調べました。
Object Classes -> All Objects -> UScreenCapture
の値をそのまま使用。(質問1:これでいいの?)
  IIDはiscreencapture.h内でDEFINE_GUIDを使って定義されてるっぽいんだけど、なんだか使い方が分かんないので値はiscreencapture.hのものをそのまま使って別に定義しました。(質問2:DEFINE_GUIDの定義したIDってどうやって使うの?ここのいちばん下にはinitguid.h使えって書いてあるんだけど、上手くいかないの。)

  後は温COM知新さんとこのサンプルをそのまま流用しています。こんなんで大丈夫なのかなと思っていたのですが、驚いた事にちゃんと動いているようです(本当に驚きました)。iscreencapture.h内で定義されている
put_Region(),put_FramesPerSec()
で設定した値が
get_Region(),get_FramesPerSec()
で読み出せています。
  だけどUScreenCaptureの動作そのものには変化が無いんです。なんで?(質問3)

  ReadMe.txtの中の
2. Image size and frame rate can be set via IAMStreamConfig interface.
の一文が怪しいので、IAMStreamConfigっていうのを使ってみようとあれこれしたんですが、これがさっぱり使い方が判りません。「こんなのちょろいよほえっ」っていう方がいらっしゃったら、使い方教えてください。(お願い)


ついで:
  ReadMe.txtの中の
You can create the filter specifying one of these interfaces, or QueryInterface from IBaseFilter.
っていう文も怪しかったので、QueryInterfaceっていうのを使ってみました。
QueryInterface版
でも結果は同じ。

  USBカメラ関連やってた時についでにキャプチャデバイス名を列挙するプログラムなんかできていたので、応用してみました。これだと事前にCLSIDを調べなくても大丈夫みたいです。しめしめ。だけどやっぱり結果は同じ。

  もちろんこのプログラムで使えないかなと思ってこんなことしているのですが、このプログラムはUScreenCaptureを使わない方向に持っていこうと思ってるのでこのままでも別に構わないと言えば構わないのです。でも、なんかこのままじゃすっきりしないのです。
教えて、エロイ人。

  とりあえずsolutionファイルprojectファイル。iscreencapture.hが必要です。


  今回の参考はここがメインでした。
Win32API(C言語)編 トップページ
  サンプルプログラムはExpress Edition対応です。
Win32API(C言語)編 第0章 はじめに
  Express Editionについての解説もあります。

Win32API(C言語)編 第60章 ウィンドウの操作①
ウィンドウスタイル一覧

Win32API(C言語)編 第22章 ビットマップを表示する
  本当は選択範囲を市松模様にしたかったんだけど、ここの例をそのままレイヤードウィンドウに適用したら表示できなかったので今回はあきらめました。
レイヤードウィンドウを作る
  なんかめんどくさそう。

  以前に宣言したとおり、選択範囲の表示はCaptureDの方法をぱくりました。画面に選択範囲を描くのではなくて、ウィンドウの表示をそのまま選択範囲にしてしまった訳です。逆転の発想ですね。表示は楽だわ、変数は減るわでらくちんです。
  だけど、選択範囲をリサイズする時の描画が変なのです。リサイズ後の描画しかしてないはずなのに、何故かマウスの位置に合わせてリサイズ前の選択範囲も描画してしまっています。そんなふうにプログラム組んでないのに。CaptureDでも同じ現象が出てるから、しょうがないのかな。

全画面をクリップボードにコピーする
  クリップボードへのキャプチャはここのサンプルそのまんまです。本当に簡単だよ。


Win32 API を使用してディスプレイ DC 上にドラッグ矩形を描画する方法
  キャプチャー範囲の描きかたは、ほとんどここのサンプルそのままです。「方法1」だと結局メインのウィンドウの外を指定できないので、「方法2」を使いました。でもポップアップウィンドウをフルスクリーンにすると画面が乱れるのよね。むーん。
  そういった事を気にしながら、同じような範囲指定方法をしているVH Screen Capture Driverの範囲指定動作を観察してみると、意外な方法で実現しているのが判ります。ぱくってみよう。

ウィンドウの作成

タイトルバーのないWindow
    case WM_LBUTTONDOWN:
        // Windowの移動
        SendMessage(hWnd, WM_SYSCOMMAND, SC_MOVE | 2, 0);
        break;

  これはカッコイイじゃん、と使ってみたのだけれど、メインウィンドウだけに適用しているはずなのに範囲指定用のウィンドウも一緒に動いてしまう。なんで?


Registry の基礎
  レジストリ操作関連は関数のパラメータが訳分かんない上に、Cの(私でも分かる)サンプルが少ないので結構探しました。このサイトはサンプル豊富で初心者向けです。トップからどうぞ。

レジストリから文字列を読み出す
レジストリに文字列の値を書きこむ
  こちらも参考にしました。

プログラミング Windows 第5版 - 第7章 まとめ
  マウスのまとめ。すばらしい。ここのまとめを全部読みたいけど、書いてある場所が散っていて探しづらい。これで(多分)全部読める。やったー。

エディットコントロール
  これだけあればじゅうぶんです。

  なにげに同じようなことしているプログラムがないかなと探してみたら、こういうのが有った。
CaptureD
おお、この方法ならデュアルディスプレイでも問題無しだ。ぱくろう。

  ついでに今さっきこんなの見つけた。
Windows/VisualStudio.NETとMeadowの連携
Emacs/VisualStudioからMeadowを起動
  こんなこともできるのか。ひゃっほー。


  ふと思った。ひと昔前にこういう事をしようと思ったら、まず神田に参考書を探しに行かなければならない。多分本代で一万円以上使う上に、それで一日(いやそれ以上)潰れる。サンプルプログラムは基本的に手打ちだ。その上、開発環境を買わなくてはならない。数万円かかる。

  今は資料やサンプルプログラムは検索すればいくらでも出てくるし、サンプルをほえっとコピペしてしまえばテストできてしまう。どうしても分からない事が有ったら、質問すればエロい人がたちどころに解決してくれたりする。昔なら答が返ってくるかどうかも判らないパソコン雑誌のQ&Aコーナーに投稿して数ヶ月待たなければならないところだ。
  その上、多少の制限が有るとはいえ開発環境がタダときている。今はPCと常時接続環境が有るのは当然だからこれを経費に考えなければ、必要なものは全部タダだ。
なんていい時代なんだ。


ついったやろうぜ
ブログ内検索
検索エンジンから来た人、思った結果が出なかったら再検索してちょ。
最新コメント
[08/27 BernardSr]
[08/27 BernardSr]
[08/27 BernardSr]
[12/29 GroverIcow]
[12/26 gayenKinesl]
[12/25 gayenKincfv]
[12/25 geRoesonokp]
[12/24 geRoesonmxu]
[06/30 LindsayDom]
[06/24 Ayukupim]
[06/22 francinerj2]
[06/21 Karsewis]
[06/17 Porsulik]
[06/16 Porsulik]
[06/16 Porsulik]
[06/16 Amimior]
[06/15 WilfordMof]
[06/11 lakeishatb1]
[06/04 Mathewlomi]
[05/31 tiopomWarriorvrp]
[05/31 Lasdumor]
[05/29 Aredorer]
[05/27 IMPUCKICT]
[05/26 Asosans]
[05/24 RaymondZice]
アクセス解析
カウンター
カレンダー
08 2017/09 10
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
プロフィール
HN:
mer2
性別:
男性
趣味:
野良猫の餌付け
Powered by ニンジャブログ  Designed by 穂高
Copyright © PCで立体視してみるぶろぐ All Rights Reserved
忍者ブログ / [PR]