プログラミング中

プログラミング

 ふと思いついた方法があったのでいろいろ試している。思いのほかうまくいっている気がする。だめなことも多いけど。とりあえず、メモ。

Next MIDI Project
.NET、C#でかんたんにMIDIでまわりをなんとかできる。ポート名の列挙のサンプルがまさにそれでありがたかった。

PPL における取り消し処理
並列処理のキャンセルについてのマイクロソフトのドキュメント。英語版のコードは新しくなっているのに、日本語は古いまま。すでになくなった関数がサンプルコードに使われているというのがGitHubで指摘されて、英語版では修正されている。

Cancellation in the PPL
これがその英語版。動く。
いずれにせよ難しいので、違う方法をとることにした。Cakewalkの人が教えてくれたらラッキー。

VisualStudioで実行exe名を変更する
プロジェクト名はそのままでOK。こんなことすら知らなかった。
変更前は $(OutDir)$(TargetName)$(TargetExt) だった。

Windowsフォームでタブ・オーダーを設定するには?
ボタンなどのコントロールのフォーカスで意図しない状態になったので調べた。表示メニューのタブオーダーで。プロパティでTabStopをFalseにするというのもあった。

BLE-MIDI (Bluetooth MIDI) Latency Measurement
BLE-MIDIのレイテンシー、ジッターに関する考察。iPad、MacではBLE-MIDIタイムスタンプが使用されてないっていう話。そういえばそんな話をどっかで見た。Windows 10のUWP MIDIもタイムスタンプは使ってないと思う(プログラムを作る側には隠蔽されてる?)。リンク先にのBLE-MIDI Parserは参考になりそう。前にも見たはずだけど忘れてた。

毎回忘れる文字列のコピー。
strcpy, strcpy_s
【C言語】文字列をコピーする方法【危険なstrcpy関数と安全な文字列複製】

アプリケーションの二重起動を抑止する – C#プログラミング
二重起動防止の手法は探すといくつかあったが、いまやってるプロジェクトでそのままつかえたのがこれ。ありがたい。

Windows Formアプリケーションでの非同期処理
UWPではいつも使ってたけど、忘れてた。関数名にasyncつければOK。

難読化を試したい。いろいろ必要。
.NETプログラムの難読化ツールの紹介と使ってみた感想

NanDoKu
Microsoft Windows SDK for Windows 7 and .NET Framework 
ConfuserExで.NETアプリケーションを難読化する
無償の逆コンパイラ「ILSpy」を利用するには?[C#]

フォームのサイズを変更できないようにする
デバッグの時はサイズ変更可能だけど、Releaseビルドではこれを有効にするとかする方向で。
そのへんは、 #if DEBUG / #else /#endif を使う。

半透過マルチアイコンfavicon.icoを作ろう!
ウェブ用だけじゃなくアプリ用アイコンもOK。複数のサイズを入れ込める。16、32、48、64、256のサイズを埋め込んで作ってみた。ちゃんと埋め込めて、プロジェクトで使えた。

.NETでAPI関数の使用
.NETでMIDIをDLL経由で使用する。UWP以前のやつ。独自の使いやすい(わかりやすい)クラスを掲載している。勉強になる。

Windows 10 WinRT API Packs released
UWPの機能がWindowsフォームアプリでも使える。最新のはMIDIもOKっぽい。使い方がわからない。
GitHubにサンプルあった
デスクトップ アプリで UWP API を呼び出す
導入はこれか。
WPFアプリ(.Net Framework)でUWPのAPIを使う
Qiitaにもあった。今の所たどりついてない。

[メモ、途中]winformsアプリケーションでUWPのAPIを使用する
こっちのほうが具体的。「 ソリューションエクスプローラ内に存在するpackage.configを右クリックし、「packages.configをPackageReferenceに移行する」を選択してください(プロジェクト名は気にしないで)。 」でいけた。

マイクロソフトのブログにあったジオロケーションのはエラーが出る(マニフェストによる許可の問題かと思ったが違うっぽい)が、ここ にあったUserディレクトリを表示するやつはうまくいった。その後、MIDIポート列挙もなんとかできた(これも許可みたいなのは不要だった)。

超簡単! WPFなどの.NETのアプリからUWPのAPIを使う~日本語の読み仮名を取得するAPIを題材に
によれば、「Capability(「機能」)の宣言は不要」とあるのだが……。古い記事(2018年3月)なので、今回の話に該当するかは不明。

続いて。今は、.NET Core だそうだ。
.NET Core 3で始めるWPFアプリ開発
事前コンパイルの話は、第2回の「ソースコードから実行まで」に出てくる。

.NET Coreの難読化について書かれているブログも発見。シングルバイナリで Dotfuscatorの結果が。
C#のDotfuscatorでの難読化とかシングルバイナリとか

これもわかりやすい。いろいろオプションがある。ReadyToRunとか。
.NET Core 3.0が来た! 〜singleバイナリやILlink、RoRなどpublishオプションの比較〜

このへんの設定はGUIでもできるそうだ。確かにできた。でかすぎ。1MBもなかったやつが130MBとかになってる。どうしたもんだろう。
.NET Core 3.0 の単一実行可能ファイル生成を手なずける

こうなってくると、どのバージョンの.NET Frameworkがインストールされてるかなんて話も気になるわけで。Windows Updateの2019で4.8がインストールされるそうだ。
方法: インストールされている .NET Framework バージョンを確認する
この解説も読んでおかないと。
.NET Frameworkについて最低限知っておくべきこと

二重起動の防止、制御について。最初使っていたのはこれ。
アプリケーションの二重起動を抑止する – C#プログラミング
二重起動時にダイアログを出していたのだが、すでに起動してるやつをそのまま最前面に出す(アクティブ化)するほうがわかりやすいかと思い、路線変更しようかと。
二重起動をした時に既に起動中のアプリケーションをアクティブにする
一見うまくいったかと思ったが、通知トレイに入ってると、アクティブ化してくれない。
そうした問題に対処している経緯が書かれたものがあった。
アプリケーションの二重起動を防止する
ちょっとむずかしそう。

プロセスID(?)を指定してKillすることができるのをやっと発見。PIDはTag経由で渡すことにした。
Kill process tree programmatically in C#
プロジェクトの参照の追加で  System.Management  を追加する必要がある。using だけじゃだめだった。これでファイル名指定じゃない方法で終了させられるように。
Tagプロパティを使う方法はこれがヒントになった。

検索中に気になったやつ。今回は使ってないけど、今後使う場面があるかも。
C# イベントハンドラに引数を渡す方法「クロージャのやり方」

トグルスイッチ。UWPにはあるのにWPFにはないので自分で作るという話。
WPFユーザーコントロールの作成例(Toggle Switch)
Nugetで簡単に使えるようになるやつがあった。作らなくて済む。MaterialDesignThemes。
【WPF】トグルボタンで ライトモード・ダークモード を切り替える
こっちのほうが最初からやるにはいいか。
デザイン知識不要?ライブラリを利用してWindowsアプリのUIを現代風に改造
Material Design In XAML Toolkitを使うには
Material Design In XAML Toolkit v3.0 の紹介 これが一番わかりやすいかも。

タイトルバーも変えたいなら MahApps 。両方を使う例がある。
WPF Prism episode: 19 ~ MahApps.Metro と Material Design In XAML Toolkit たちは Prism でも余裕で生き抜くようです! ~
これも。
Material Design In XAML Toolkitでお手軽にWPFアプリを美しく

出来上がったWPFプログラムのインストーラーを作る。
Visual Studio 2017でインストーラ作成
上書きバージョンアップできるようにするには、プログラムのVersionなどを指定するのが必須。
【WPF】上書きインストール可能なインストーラーの作成方法
出来上がったファイルを直接指定して作成することもできる(Add File)んだけど、ビルドでエラーが出る( ‘AMD64’ is not compatible with the project’s target platform ‘x86’ )。ターゲットが違うからだそうだ。 プロジェクトファイル”.vdproj”ファイルをメモ帳などのテキストエディタで開き、ファイル内の “TargetPlatform” の値を3:1にすればOK。
Visual Studio Installer Project で “(ターゲット名) is not compatible with the project’s target platform ‘x86′” メッセージが表示されビルドができない

出力時の注意。pdbファイルを出力しないようにとか。
Visual StudioユーザーがReleaseビルドをするときに必ずやってほしい2つの設定

WPFではNotifyIconが簡単に設定できないそうだ。それでもできないことはないという。
WPFでタスクトレイにアイコンを表示する
こっちがいいかも? 1ファイルにまとめたコードをGitHubに公開している。
WPF用にNotifyIconクラスをラップしてみた

WPFを.NET Coreでやってたのだけど、配布を考えると.NET Frameworkのほうがいいかもということで、作り直し。exeとdllが別れて出力される。一緒にするオプションがCoreではあったのだが。と思って探すとこんなのが。
「Costura.Fodyを使え」これで一発。
【WPF】複数のDLLをまとめて1つのexeにする

C++で文字の比較など。
文字列を比較する strcmp、wcscmp、_mbscmp
今回のプログラムではこっち↓のほうが適していた。
文字列の最初から文字列を検索する strstr、wcsstr、_mbsstr
複数の文字列に対する処理でうまくいかなくていろいろ調べたり試したり。実際にやってみないとぴんとこないものだなあ。



コメント