デスクトップの動画や画像をキャプチャーするときに、その範囲をマウスで指定できるツールがあります。 その範囲指定の枠をwpfで楽に作るサンプルです。 あまり試してないけど、そこそこ良さそうな出来でした。 ここにメモを残しておきます。
このページを参考にしました。
- とんがれ! ほげたん ...... WPFでリサイズ可能な枠なしウィンドウを作成する
範囲選択用の枠はこんな感じです。
デスクトップの動画や画像をキャプチャーするときに、その範囲をマウスで指定できるツールがあります。 その範囲指定の枠をwpfで楽に作るサンプルです。 あまり試してないけど、そこそこ良さそうな出来でした。 ここにメモを残しておきます。
このページを参考にしました。
範囲選択用の枠はこんな感じです。
自分用のツールを作ろうかと色々調べていたら過去の自分の投稿にたどり着きました。
「64bit環境でC#からWin32APIのWindowFromPointを呼び出すと失敗する」と書いてあります。 「じゃあ今やろうとしている事できないの?」とさらに検索しようとしたら......WindowFromPointとテキストボックスに入れた時点でサジェッションに64bitとかx64とか出てくるんですよね。 「もしかして未だに解決してない?」と思ったら最初の検索結果であっさり解決しました。
2019年5月追記) DecryptSSLの機能を使うにはFiddler用のルート認証が必要になります。 (最初この記事を書いたときはFiddler本体も入っていたので気付きませんでした)
一番手っ取り早くルート認証をインストールする方法はFiddler本体をインストールしてメインメニューの「Tools」-「Options」から「HTTPS」タブを選択、「Capture HTTPS CONNECTs」と「Decrypt HTTPS traffic」をチェックします。 ダイアログが表示されるので、中身をよく読んでルート認証をインストールしましょう。
追記終わり//
FiddlerはProxy型のhttp通信のデバッグツールです。 http通信を見張るだけではなく、リクエストやレスポンスを差し替えるなどかなり深い部分を触れるツールになっています。 サーバー側の変更をせずにレスポンスを書き換えることでウェブページのjavascriptをデバッグしたりとか、色んな用途に使われています。
強力なツールなだけに取っ付きにくい部分があります。 「あれがやりたいだけなのに……」ってときに重すぎるんですよね。 で、そのコア機能だけを提供するFiddlerCoreというライブラリが公開されています。 これを使って簡単なコードを書いた方が目的を気軽に達成できるケースも多い事でしょう。 そんなわけで今回はFiddlerCoreに触ってみました。 試しに通信中の画像ファイルを保存するサンプルコードを書いたので、そのメモを残しておきます。
※ FiddlerCoreを使う注意点として、ライセンスの問題があります。 詳しく調べていないのでよく分かりませんが、アプリに組み込んで配布するにはお金を払わないといけないのかな? (2015年あたりからそうなったっぽいです。) って事で多分フリーソフトに組み込むのは現実的ではありません。 趣味で使う場合は自分用ツールで、公開するならソース配布という事になりそうですね。
ちなみにリファレンスとかチュートリアルとかのドキュメントは一切読んでません。 適当です、適当。 その辺踏まえてお読みください。
YouTubeで適当に動画を見ていて「このチャンネルの動画最初から見てみようかな?」ってなったことありませんか? で、そのチャンネルに700本くらい動画があったら……。
YouTubeの動画の絞り込み機能って貧弱なんですよね。 特にチャンネルの動画一覧のページにある機能はほとんど何もできません。 せめて日付で絞り込む機能があればいいんですけど、現状追加日で並び替えて古い順から見てくしかないのかな? 最初の数十本はそれでいいのかもしれません。 でも700本中の300本目とか、探すだけでも大変で困ります。
そういえばずっと前にYouTubeの自分のチャンネルの動画をリストアップするコードを作ったよな? でも確かめてみると今は動かないようです。 今のやり方で作り直すしかないようです。 って事で自分用の簡単なツールをあらためて作ってみました。
パズドラの投稿の最後に何となくAmazonの広告を載せています。 個別商品リンクです。 その広告、今はいいんですがすぐに古くなりますよね。 数ヶ月に1度、1つのファイルを書き換えたら関連投稿の記述全てが入れ替わるようにできないか、考えてみました。 ついでですが、Amazonの広告はPC用とスマホ用で別のリンクを作らなければなりません。 スクリプトで判定して別のファイルを読むようにしてみました。
まずはスクリプトの格納先から説明しましょう。 bloggerに投稿しているなら同じアカウントでgoogle driveも使えるはずです。 google driveにはディレクトリやファイルを公開するとhtmlサーバとして動いてくれる機能があります。 それを使います。
adb(Android Debug Bridge)というソフトウェアがあります。 android端末をCUIで扱ったりすることができるソフトです。 ちょっと使いたいネタがあったのでadbを含んだ開発環境をインストールしました。 androidアプリの開発にも興味があったのでAndroid Studioを選びました。
で、Android Studioのインストールでちょっとしたトラブルがありました。 セキュリティソフトのavastが誤検出したのです。 platform-toolsというフォルダの中の実行ファイルがやられました。 確かにgoogleオフィシャルからダウンロードしたAndroid Studioだと再確認、もちろんマルウェア騒ぎなどない事も確認してから手動で誤検出されたファイルを戻しました。 しかしAndroid Studioは起動せず。 再インストールしました。
今、自分で使う適当なツールを作ってます。 それでMediaElementを使ってました。 mp4の動画ファイルを再生しながら試行錯誤して作ってきて9割くらいできたかな? ってところで試しにmp3の音楽を流そうとして失敗。 「これじゃ使えない」ってことで失敗した理由を調べてみました。
ネットで調べた内容では根本的な原因とか解決策は見つからず。 分からないなりにVisual Studio Expressでゴニョゴニョやっていたら原因判明。 音声のみのメディアを再生するときに MediaElement.ScrubbingEnabled = true になっていたら動きませんでした。
xamlでcanvasを使ってアイコンを描きました。 それを、例えば次のようにして使いまわそうとしても失敗します。 2つ目のボタンにしかアイコンが表示されません。
ListBoxやListViewの選択項目がクリックで変更されたときに実行したい処理があったので、検出のしかたを調べてみました。 ヒントになったのはこんな情報。
参考ページにはListViewの選択済みの項目がクリックされたのを検出する方法が書いてありますね。 ListViewItemのPreviewMouseLeftButtonDownイベントで検出しています。 Previewイベントという事でListViewの選択項目が反映される前のListViewItemの状態を見る事ができます。 そこでIsSelectedを見れば、まだ選択されていないものがクリックされてこれから選択が変更されるところなのか、選択済みのものがクリックされたのかが分かるという仕組みです。
ListViewでもListBoxでもだいたい同じです。 そして、IsSelectedを見て分岐するところを参考ページと逆にすれば目的が達成できそうですね。
今、適当に自分で使うツールを作っています。 作っているツールはキーボードショートカットで色々できるようにするつもりです。 で、[Ctrl+1]とかのショートカットは普通にwpf標準のコードでできるんですが、Ctrlキーの左右は指定できないんですよね。 でも左右で別の処理をさせたい。 「ローカルキーフックとかしないとダメなのかなぁ? なんとかならないかなぁ?」と検索してたら、KeyGestureを継承したクラスでできることがわかりました。 あんまり動作確認はしてないけど、次のようなコードでShiftキーとCtrlキーについては左右の判別ができそうです。 (一応コードにはできそうなそぶりで書いてあるけど、AltキーとWinキーは正常に動きませんでした。)
検索してもそのものズバリが出てこなかったので一応書いてみました。 特定の行のListViewItemを探すには次のコードを使います。
でもこれだけじゃダメです。 ListViewはデフォルトでVirtualizingStackPanelを使っています。 VirtualizingStackPanel上では画面に必要なListViewItemしか作られません。 そのおかげで大量に行を登録しても軽快に動くのですが、当然作られていないListViewItemにはアクセスできません。 ContainerFromIndexを呼んでもnullが返ってきます。
基本的なことかもしれませんが、最近初めて気付きました。 例えば、あるBorderの高さのBindingを解除する場合、普通はこうします。
DependencyProperty prop = Border.HeightProperty;
if (BindingOperations.IsDataBound(border, prop))
BindingOperations.ClearBinding(border, prop);
その代わりにこうしてもいいようです。
border.Height = border.ActualHeight;
まぁ「解除できる」というか、解除されてしまったせいでバグになってつまづいたんですけどね。 すぐに理由が分かってよかった。
xamlではなく、C#のコードでのお話です。 以前の投稿でINotifyPropertyChangedでの通知対象のプロパティ名をリファクターできるようにするためのコードを書きました。 今回はそれを元に、Bindingするときのプロパティ名をリファクターできるようにしました。
考えるキッカケになったのはこんなコード。
こういうふうにするんだそうです。
参考ページはこちら。
日本語の方のページには「式木とか実はよくわからない」って書いてますね。 私もです。 MSDNの方をよく読んだら解説っぽいことが書いてあるので、興味と根性がある人は読んでみてはどうでしょうか?
実行速度が必要な処理には使わない方が良さそうですが、どうなんでしょう? まぁそういうのにはINotifyPropertyChanged自体使わないんでしょうけど。
ListViewの余白部分を右クリックしたときにポップアップメニューを出す場合、ListViewのContextMenuは使えません。 余白だけでなく、ListViewItemなどをクリックしたときにもポップアップメニューが出てしまうためです。 そのとき、ListViewItemに載せたコントロールにContextMenuを付けてもListViewのContextMenuが優先されて、ListViewItemのメニューは表示されません。 ListViewItemのContextMenuOpeningイベントで
とかすればListViewItemをクリックしたときポップアップメニューが表示されないようにはできますが、当然そうするとListViewItemのContextMenuは使えません。
解決策はうまく検索すれば見つかりそうですが、見つからなかったので自分でやり方を試行錯誤しました。 で、見つかったのがこれ。 結局単純なやり方で済ませました。
MediaElementで動画を再生するときのお話。 ポーズ中にシークすると、デフォルトのままだとシーク後の現在時刻が内部的に変化しても画面に反映されません。 画面を更新するには動画の再生をしなければならないんです。 でも、これじゃシークで好きなシーンを探せないですよね? 「どうすりゃいいんだ?」と検索したら、MediaElementでサムネイルを作る方法を書いたTipsのページにヒントがありました。 MediaElementのScrubbingEnabledプロパティをTrueにすればいいようです。 それだけ。
注意点としては、「 ScrubbingEnabled を true に設定すると、パフォーマンスが多少低下することがあります(メディアの再生を対話的に制御する場合など)」だそうです。
2014/06/02 config.xmlの例を現時点で公開されている漫画の情報にあわせて更新しました。 ツールのアーカイブの中身は変更してません。 使う方はconfig.xmlの例を元に適宜設定ファイルを書き換えてください。
2014/04/24 ちょっと修正。 バージョン管理するほどの物ではないのでバージョン番号とか付けてません。 ツールの中身は変わってます。
裏サンデーってレイアウトとか画像読み込みとかがアレで読みづらいですよね。 画像だけダウンロードして自分で用意したビューアを使って読んだ方がいい。 というわけで、ダウンロード用の簡単なツールを作ってみました。
リンク先のファイルメニューからダウンロードしてください。
アマゾンでお買い物