カテゴリー: C#

C#メモ 起動時に表示されるFormを最小化にして表示されないようにしてみる

常駐するアプリを作る機会があったけど、気になったので。

ポイントはこんだけ。

  • FormのWindowStateをMinimizedにする

まずはフォームアプリケーションのプロジェクトを作る。

デザイナでフォームのプロパティを開いて、WindowStateプロパティをMinimizedに変更する。

で、実行してみたらこんな感じ…何も出てこん。

タスクパーにはちゃんとおる。

タスクバーのアイコンをクリックすればちゃんとフォームが表示される。

んまま、明日への自分へのメモってことで。

 

Filed under: C#Tagged with: , , , , , , , , , , , , , , , , , ,

C#メモ Excelのウィンドウ枠の固定みたいにDataGridViewをスクロールしても行と列を固定で表示するようにしてみる

知ってればとっても簡単だった…。

  • 固定したい行のDataGridView.Columns.Frozenプロパティをtrueにする
  • 固定したい列のDataGridView.Rows.Frozenプロパティをtrueにする

まずは、フォームはこんな感じ。
真ん中にDataGridViewを配置しといてDockプロパティをFillにしといた。

んで、コードはこんな感じ。
コードはフォームのLoadイベントに実装。

で、実行してみるとこんな感じ。
フォームを表示するとこんな感じで表示してて…。

スクロールバーでテーブルの左上が見切れるように表示を変更すると1行目と1列目が表示されたままになっとる。

ちなみに、Frozenプロパティを指定した行番号や列番号がDataGridViewにある行数あるいは行数の範囲をこえて設定しようとすると例外が発生する…。
なので、DataGridViewでテーブルを作ってからプロパティを設定する方がいいかも。

そんなこんなで、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , , , , , , ,

C#メモ コンソールなアプリケーションでTaskDialogを表示してみる

前回(記事はここ)は途中で諦めちゃったけど…コメントでアドバイスいただいたので試してみることに。

ポイントはこんなとこ。

  • Windows API Code Packをインストールする
  • アプリケーションマニュフェストファイルを追加する
  • アプリケーションマニュフェストファイルのdependencyタグのところのコメントを外す
  • TaskDialogを作成&表示する

コンソールアプリケーションを作っといて…Windows API Code Packをインストールする。
インストールする手順は前回(記事はここ)の内容を参考に。

んで、プロジェクトにマニュフェストファイルを追加しとく。
追加したらこんな感じ。

んで、マニュフェストでdependencyタグのところがコメントになっているので外す。
コメントを外したとこはこんな感じ。

で、今回のコードはこんな感じ。

実行してみるとこんな感じ。

ちなみに、今回書いたコードはコンソールをキー入力待ちで止めるようにしてある。

あざっす!
そんなこんなで、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , ,

C#メモ Excelのexeの場所をフルパスで取得してみる

野暮用で必要になったんだけど、どうも納得いくものがなくて悩んだ。
レジストリから取得するのが一番手取り早いんだけど、レジストリの名前が変わったらメンテしないといけない。
かといって、xlsxみたいなファイルの拡張子からたどるのは、(もうないとは思うけど…)2003から2007で拡張子が変わったときみたいに変わる可能性があるので都度メンテしないといけない。
他に変わらなさそうなものは…商品名は変わらんだろうってことになり。

ってことで、今回のポイントはこんなとこ。
※Microsoft.Office.Interop.Excel.Application.PathはExcelのモジュールがあるフォルダーしか取得できないので今回は見送り…。

  • Microsoft.Office.Interop.Excel.ApplicationクラスをnewしてExcelのプロセスを作成する
    ※Excelのプロセスは必ずCOMの解放処理を行うこと!でないと、Excelのプロセスが残っちゃう…
  • System.Diagnostics.Process.GetProcessesByNameの引数に”Excel”を指定してExcelのプロセスを名前で検索する
  • 取得したプロセスのMainModule.FileNameプロパティで実行ファイルのフルパスを取得する

ExcelのCOMオブジェクトへの参照設定はあらかじめしておくこととして…コードはこんな感じ。

で、実行したらこんな感じ。

欠点はこんな感じ。

  • Excelプロセスが必ず作成される
  • Excelプロセスを破棄するときにCOMオブジェクトの解放を真面目にやらないといけない

ただ、同じような処理を考えればWordやPowerPointにも応用できそう。

そんなこんなで、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , ,

C#メモ ExcelのCOMオブジェクトの破棄処理を実行直後にしてみる

なんか…メインプロセスを終了しないと、Excelのプロセスが残っちゃう。
ってか、実行するとどんどん増えてく。
たとえば、コントロールパネルでみてみるとこんな感じでプロセスが実行した分だけ残っちゃう。

これで困るのはこんな感じ。

  • いらないプロセスがどんどん増えてメモリを余計に使ってしまう
  • ファイルを開いて処理して閉じることを繰り返すような処理をする場合、Excel自体の設定の変更が無視される
    ※最初に作ったExcelのプロセスでファイルを開くことになるので設定がそのまま

はじめに用意したメソッドはこんな感じ。
ExcelアプリケーションをQuit()メソッドで終了すれば勝手にCOMオブジェクトを開放してくれると思ったけど…そうはいかないみたい。
特にGUIでEXCELを開いたり閉じたりするような処理をするときは、プロセスがずっと残っててEXCELファイルが読み取り専用になっちゃったりするから続けて処理ができない。

いろいろ調べてみるとMicrosoftのページに書いてあった…。

https://blogs.msdn.microsoft.com/office_client_development_support_blog/2012/02/09/office-5/

で、対策のポイントはこんな感じ。

  • Excelで作ったオブジェクトはSystem.Runtime.InteropServices.Marshal.ReleaseComObject()で破棄したあとにnullを設定する
  • CG.Collect()→GC.WaitForPendingFinalizers()→GC.Collect()でガベージコレクターの内容をクリアする
  • Quit()メソッドは他のCOMオブジェクトを開放した後に呼び出す
  • もう一回CG.Collect()→GC.WaitForPendingFinalizers()→GC.Collect()でガベージコレクターの内容をクリアする

で、コード。
今回はExcelのファイルを開いて閉じるだけの処理を5回繰り返すことにする。
まずは、Excelのファイルを開いて閉じるだけの処理をするメソッドはこんな感じ。

テスト用に作ったメソッドはこんな感じ。
5回繰り返す処理だけ。

実行してみるとこんな感じ…コマンドプロンプトだけではわからん。

タスクマネージャーをみてみると、実行したときに前はプロセスが残ってたんだけど…残ってない!

そんなこんなで、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , , , , ,

C#メモ 外部モジュールがコンソールに出力する文字列を取得してみる

外部プログラムとして呼び出す実行モジュールの文字列を調べたくなったので。

ポイントとしてはこんな感じ

  • ProcessStartInfoクラスでプロセス実行時の設定をする
  • プロセス実行時の設定は次のように設定する
    • UseShellExecuteプロパティをfalse
    • RedirectStandardOutputプロパティをtrue
  • Process.StandardOutput.ReadToEnd()でコンソールに出力した文字列を取得する

サンプルとして作ったプロジェクトはこんな感じ。
Outsideってプロジェクトは外部モジュールとして呼び出される方でProtoはOutsideのモジュールを呼び出すようにする。

とりあえず、実行モジュールとしてはこんな文字列を出力するものを準備した。

んで、コードとしてはこんな感じ。

OutsideプロジェクトをDビルドしてからProtoプロジェクトを実行してみるとこんな感じ。
一応、文字列を読み取ってくれとる。

んまま、自己満足ってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , , , , ,

C#メモ Manifestファイルを追加してフォームの表示がぼやっとしているのをはっきりさせてみる

なんかWindows10だとダイアログの文字列がぼやっとする。

調べてみたらDPIの設定次第なんだそうな。
で、ポイントはこんな感じ。

  • プロジェクトにManifestファイルを追加する
  • dpiAwareタグをコメントアウトする

とりあえず、コンソールプロジェクトを作ってメッセージを表示してみる。
メッセージを表示するコードはこんな感じ。

んで、Manifestファイルを追加する。
追加する手順はこんな感じ。

  1. プロジェクトを右クリックする。
  2. メニューの追加/新しい項目をクリックする。
  3. 新しい項目の追加って画面が表示されるので、真ん中のリストから”マニュフェスト”を選んで”追加”ボタンをクリックする。
    今回は”app.manifest”ってファイル名にした。
  4. ソリューションのツリーにapp.manifestって項目が表示されたら追加おしまい。

んで、追加したManifestファイルを編集する。
最初はこんな感じになってて、コメントアウトしてある。

<application>タグのところにある<!–と–>の文字列を削除してコメントアウトをはずす。

で、実行してみるとこんな感じ。

そんなこんなで明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , , , , ,

C#メモ SHGetFileInfo()メソッドを使ってファイルのプロパティの全般タブに表示されるファイルの種類の文字列を取得してみる

ファイルの種類は拡張子でも判別できるんだけど同じアプリでもいろんな拡張子(例えばExcelだとxls、xlsx、xlsmとか)だったりする場合があるので、別の判別方法はないものかと。
ファイルのプロパティにファイルの種類ってのがあるからとりあえずこいつを使ってみようと思ったのが発端。

ネットに聞いてみたけど、C#のAPIになくて..調べるのに予想以上に時間かかったのでメモっとくことに。
ポイントはこんな感じ。

  • IWshRuntimeLibrary(Windows Script Host Object Model)を参照する
  • Windows APIのうちSHGetFileInfoメソッドを使う

今回はコンソールアプリで試すことにして準備としてはCOMのうち”Windows Script Host Object Model”ってのの参照を追加するように設定する。

設定できると、ソリューションエクスプローラーのプロジェクトのツリーの中で参照ってとこに”IWshRuntimeLibrary”ってのが追加される。

んで、実際のコードはこんな感じ。
まずは、Windows APIのSHGetFileInfoメソッドをインポートする定義はこんな感じ。

次にファイル情報を保持する構造体の定義はこんな感じ。
上で定義したメソッドの出力引数になる。

それから、エントリーポイントのコードはこんな感じ。

実行してみたらこんな感じ…今回はWordのファイルを試してみたんだけど、ちゃんと”Microsoft Word 文章”ってダイアログに表示されている文字列と同じ内容になっとる。

んまま、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , , , ,

C#メモ Windows API Code Packに入っているTaskDialogクラスを使って少しリッチなメッセージダイアログを表示してみる

よく例外とかで表示されるあのダイアログってMessageBoxクラスより少しリッチでいいなぁ…。
でも、標準だとそれっぽいダイアログが表示できないし…どうやってやるんだろうって思ってネットに聞いてまわったらあるんだねぇ…。

ポイントはこんな感じ…そんなむずくない。

  • プロジェクトを開く(または新規作成する)
  • Windows API Code Packをインストールする
  • Microsoft.WindowsAPICodePack.Dialogs.TaskDialogクラスのShow()メソッドを使ってダイアログを表示する

まずはWindows API Code Packってのをインストールする。
こいつは基本的にはプロジェクト毎で使うっぽいのでプロジェクトを作成するところから始める。

  1. Visual Studioのメニューで”ファイル/新規作成/プロジェクト”をクリックする。
  2. ウィザードが起動する。
    とりあえず、今回は”Windows フォーム アプリケーション (.NET Framework)”ってテンプレート”を使うことにする。

    テンプレートを使って作ったプロジェクトはこんな感じ。

次にパッケージをダウンロードしてくる。

  1. Visual Studioのメニューで”表示/その他のウィンドウ/パッケージマネージャー コンソール”をクリックする。

    “パッケージ マネージャー コンソール”ってウィンドウが表示される。
  2. パッケージマネージャーコンソールってウィンドウはコマンドプロンプトみたいにキー入力できる

    入力するコマンドはこんな感じ。
    実行すると何やら”パッケージマネージャーコンソール”にメッセージが表示されてパッケージをダウンロードとかしてくるのでしばらく待っとく。

  3. ダウンロードとかが終わると”ソリューションエクスプローラー”に”packages.config”って項目が追加される。

    実際にはソリューションのフォルダーにpackagesってフォルダーが追加されていて…

    Windows API Code Packに関係するフォルダーやファイルが追加される。

    これでWindows API Code Packが使えるようになったっぽい。

とりあえず、コードはこんな感じ。
いろいろできるみたいだけど、まずはMessageBoxクラスに相当する感じで。

実行してみるとこんな感じ。
ちょっとリッチ?

ちなみに、コンソールアプリだと例外が表示されちゃう。
dllのバージョンが云々言ってるんだけど…ここの問題はあと回し…。

そんなこんなで、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , ,

C#メモ インストールされているアプリケーションのリストを取得してみる

ヤボ用で必要になったので。
ポイントはこんなとこ?

  • 起点にするレジストリの場所はここ
    SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall
  • Microsoft.Win32.Registry.LocalMachine.OpenSubKey()で起点にするレジストリの情報を取得してくる
  • さらにその子のレジストリの情報をとってこれればインストールしているアプリケーションがわかる

ただ、レジストリキーはOSで32bitか64bitかで違うとか…いろいろ前提があるみたい。
今回試した端末とビルドの条件はこんな感じ。

  • Windows 10 64bit
  • コードはAny CPUでビルド

で、コードはこんな感じ。

実行したらこんな感じになった。

ちなみに、コントロールパネルの”プログラムのアンインストールまたは変更”の項目と一緒になったってのは確認できた。

んまま、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , , , , , , , ,

C#メモ ショートカットを作成してみる

どやるんだろ?って思ってネットに聞きながら。

ポイントはこんな感じ。

  • シェルを扱えるようになるCOMでIWshRuntimeLibrary(Windows Script Host Object Model)ってのへの参照を追加する
  • IWshRuntimeLibrary.WshShell.CreateShortcut()メソッドでショートカットを作成するオブジェクトを作成する
  • ショートカットを作成するオブジェクトのプロパティを使って作成する条件を設定する
  • Save()メソッドでショートカットを作成する

まずは参照を追加する。
追加する参照は”Windows Script Host Object Model”。

 

参照を追加したらこんな感じ。

んで、コードはこんな感じ。

んで、実行してみるとこんな感じ。
指定した場所(今回はデスクトップ)にショートカットができとる。

ショートカットのプロパティを見てみると指定したアプリが設定されとる。

んで、ショートカットをダブルクリックしてみるとアプリ(今回はnotepad)が起動した。

とりあえず、作るとこまでかな。
んまま、メモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , , , , , ,

C#メモ Formを閉じたときのイベントFormClosedでクリックしたボタンを判定してみる

なんか…Formを閉じるときにクリックしたボタンごとにメソッドを用意するんでなくて、メソッドを1つにして処理をまとめたかった…で、ネットに聞いてみたらできたのでメモ。

ポイントとしてはこんなとこかも。

  • 用意するボタンのDialogResultプロパティを設定する
  • Formを閉じたときのイベントFormClosedのイベントを追加する
  • FormClosedイベントでDialogResultプロパティの値で処理を分ける

で、サンプルとして作ったFormの見た目はこんな感じ。
Formの名前はMainFormにした。追加したOKボタンとキャンセルボタンの名前それぞれOkayButtonとRejectButtonにした。

MainFormのプロパティはこんな感じ。

MainFormのイベントはこんな感じ。
フォームを閉じたときのイベントFormClosedを追加してOnFormClosedってメソッド名をつけた。

OkayButtonのプロパティはこんな感じ。
ボタンをクリックしたときに設定されるDialogResultの値は”OK”に設定しといた。

OkayButtonのイベントはこんな感じ。
クリックしたときのイベントはOnClickOkayButtonってメソッド名をつけた。

RejectButtonのプロパティはこんな感じ。
ボタンをクリックしたときに設定されるDialogResultの値は”Cancel”に設定しといた。

んで、イベントはこんな感じ。
クリックしたときのイベントはOnClickRejectButtonってメソッド名をつけた。

んで、コードはこんな感じ。
まずはOKボタンをクリックしたときのイベントのメソッドの内容。
ただ、Formを閉じるだけ。

キャンセルボタンをクリックしたときのイベントのメソッドの内容。
これも、ただただFormを閉じるだけ。

最後にフォームを閉じたときのイベントはこんな感じ。
DialogResultの内容でどのボタンをクリックしたか判定する感じ。

実行してみたらこんな感じ。
まずはメインとなるフォームMainFormを表示する。

MainFormのOKボタンをクリックすると”OKボタンをクリックした”っていうメッセージのダイアログを表示する。

で、同じようにMainFormのキャンセルボタンをクリックすると”キャンセルボタンをクリックした”っていうメッセージのダイアログを表示する。

ちなみに、×ボタンをクリックすると”×ボタンをクリックした”っていうメッセージのダイアログを表示する。
×ボタンにはDialogResultの値を設定していないので、値はNoneってなってその他な分岐の処理を実行するため。

ちなみにボタンでなくてもFormのDialogResultプロパティの値を設定できるので、必要に応じて設定するといい感じになるかも。

んまま、メモってことで。

Filed under: C#Tagged with: , , , , , , , , , , ,

C#メモ Escキーを押したらフォームが閉じるようにしてみる

メインになるフォームから呼ばれる子フォームをさくっと閉じるようにしたいなぁって思ってネットに聞いたら、さくっとできるんだねぇ…。

ポイントとしてはこんな感じ。

  • フォームを閉じるイベントを実行するボタンを作る
  • FormのCancelButtonプロパティに実行するボタンを指定する
    (ESCキーを押したらあたかもボタンをクリックしたように振る舞うって感じ)

今回はサンプルとしてフォーム自体を閉じるようにする。
まずはフォームでMainFormって名前にしてこんな感じ。

ボタンのプロパティはこんな感じ。

ボタンのClickイベントにイベントを追加する。
イベントのメソッド名はOnClickExitButtonって名前にした。

ボタンをクリックしたときのイベントのコードはこんな感じ。

あとはMainFormのプロパティでCancelButtonってとこの値をさっき作ったボタンの名前に変更する。

んで、実行してみるとこんな感じ。
フォームが表示されたらESCキーを押すとフォームが消える。

んまま、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , ,

C#メモ 並列処理ができるBackgroundWorkerクラスを使ってみる

やっぱりWindowsのアプリを作るからにはUIは操作できるようにたくなったので。
ポイントとしてはこんなとこっぽい。

  • BackgoundWorkerをフォームへ追加
  • BackgroundWorkerへ処理を追加する
  • BackgroundWorkerの動作イベントを呼び出す(今回はフォームをロードしたら動作するようにする)

まずは、メインにするフォームをこんな感じで作っとく。

  1. フォームのクラス名はMainForm、タイトルバーの表示はProtoってした。
  2. ツールボックスのBackgroundWorkerをフォームに追加する。
  3. 今回はフォームが表示されたときに並列処理を開始したいので、フォームのイベントでLoadの項目にメソッドを追加する。
    メソッド名はOnLoadって名前にした。
  4. BackgroundWorkerのイベントでDoWorkっていう実際に並列処理をするイベントと、RunWorkerCompletedっていう処理が終了したときのイベントを追加しとく。
    メソッド名はDoWorkがOnDoWorkって名前、RunWorkerCompletedがOnRunWorkerComletedって名前にした。

んで、コード。
まずはフォームをロードしたときのイベントで、OnLoadメソッドのコードはこんな感じ。
BackgroundWorkerクラスのインスタンスのRunWorkerAsync()ってメソッドを呼び出すようにコードを書いとく。

次はBackgroundWorkerクラスのインスタンスで並列処理をするときのイベントで、OnDoWorkerメソッドのコードはこんな感じ。
とりあえずメッセージボックスで処理が始まったよ?って事を表示したあとで何もせずに10秒待つって内容にした。

んで、並列処理が終わったときのイベントで、OnRunCompletedメソッドのコードはこんな感じ。
なんもなしでシレッと終わったらわからないので、これまたメッセージボックスを表示するようにした。

んで、実行したらこんな感じ。

  1. 実行するとすぐにこんなメッセージボックスが表示される。
  2. んで、メイン画面が表示される。
    このとき既に並列処理が始まってるんだけど、ちゃんとマウス操作もできる。
  3. 10秒すると何もしていないのにこんなメッセージボックスが表示される。

ちなみに、進捗を検知するイベントは次回…。

そんなこんなで、明日への自分へのメモってことで。

Filed under: C#Tagged with: , , , , , , , , , , , , , , , , ,

C#メモ TreeViewの先頭のTreeNodeを選択状態にしてみる

ツリービューのノードを制御したいときがあったので…大雑把にはこんな感じ。

  1. TreeViewNodeの先頭のオブジェクトを取ってくる
  2. 1のオブジェクトを選択状態にする

んで、サンプルとして用意したFormはこんな感じ。
TreeViewの名前はMainTreeView、Buttonの名前はActionButtonにした。

TreeViewのプロパティはこんな感じで設定した。

  • FullRowSelect…True
  • HideSelection…False
  • Nodes…ノードを3個追加しとく
  • ShowLines…False
  • ShowPlusMinus…False
  • ShowRootLines…False
  • BorderStyle…FixedSingle
  • ItemHight…24

んで、コードはこんな感じ。

で、起動したすぐはこんな感じ。

とりあえず3番目のノードをクリックしてみて…

ボタンをクリックすると先頭のノードが選択状態になる。

これを応用すりゃ好きなとこを選択状態にできるっぽい。
んまま、メモってことで。

Filed under: C#Tagged with: , , , , , , , , , , ,