Archive for the ‘Windows’ Category

なにかの操作をしていて、急にかな入力になってしまう場合がある。
そして、戻し方を忘れてしまうので、メモ
ただし、BootCampでWindowsを起動しているMacが対象

Alt+かな(スペースの右隣)

「KA」と入力したいのに「のち」になったときはイラっとする。。。

覚えておこう

実データを操作するプログラムを作るときに、必ずといっていいほどパスの結合を行う。
そんなときに、使うメソッドは、System.IO.Path.Combine(path1,path2)で
path1とpath2を結合して、ファイルパスとして生成してくれる。
こんな感じ

  1.  
  2. string path1 = @"C:\test\subtest\";
  3. string path2 = "test.txt";
  4. string filePath = System.IO.Path.Combine(path1, path2 );
  5. //filePathには"C:\test\subtest\test.txt"という値が入る
  6.  

非常に便利だが、
path2の先頭が\だと、予想外の動きに。。。

  1.  
  2. string path1 = @"C:\test\subtest\";
  3. string path2 = @"\test.txt";
  4. string filePath = System.IO.Path.Combine(path1, path2 );
  5. //filePathには"\test.txt"という値が入る
  6.  

検索してみるたら、参考になる記事を発見
【C#】パスが結合できない

さらに
MSDNでしらべてみたところ、こんな記述が

“path2 にルートが含まれていない (たとえば、path2 が区切り記号またはドライブ仕様で始まらない) 場合は、間に区切り記号が入った 2 つのパスの連結が返されます。 path2 にルートが含まれている場合は、path2 が返されます。 ”

つまり、区切り文字「\」から始まると、ルートと判断されて、path2だけが帰ってきてしまうのですね。。。
ちゃんと読まないとだけど、エラーとかにして欲しいかも。。。

アプリケーションを作っていて、設定ファイルの書き換えなどで、
再度、アプリケーションを最初から実行したいときが結構ある。
そのような場合に下記のコードで、アプリケーションの再起動ができる

  1.  
  2. Application.Restart();
  3.  

フォルダを選択させるときに、
次のような画面を使うケースが多々ある。

デフォルトフォルダ選択ダイアログ

デフォルトフォルダ選択ダイアログ

実際のソース

  1.  
  2. FolderBrowserDialog fb = new FolderBrowserDialog();
  3. DialogResult dr = fb.ShowDialog();
  4. if (dr == DialogResult.OK)
  5. {
  6.     textbox1.Text = fb.SelectedPath;
  7. }
  8.  

OKが押されたらtextBox1のテキストプロパティにそのパスを書くとしています。

以下の構文を使う

  1.  
  2. Environment.Exit(0);
  3.  

EExplorerの右クリックメニューに
「新しいウィンドウ」で開くを追加する方法

レジストリをいじります。
#レジストリをいじるので、
#不正に設定した場合は、最悪システムの再インストールが必要になるので、
#注意が必要です。

手動の方法
1.「スタート」→「ファイル名を指定して実行」
2.出てきたダイアログに「regedit」と入力し、エンター
3.レジストリエディタが立ち上がるので、以下の設定場所へ左側の
 ツリービューをたどっていく
 「HKEY_CLASSES_ROOT\Directory\shell」
4.3のshellを選択し、右クリックで「新規」→「キー」
 名前を「opennew」※特に名前はかぶらなきゃOK
5.4で作成したopennewを選択し、右側の「既定」の値を
 「新しいウィンドウで開く」とする
6.4で作成したopennewを選択し、再度右クリック「新規」→「キー」
 名前を「command」にする
7.6で作成したcommandの「既定」の値を「explorer %1」とする

これで、フォルダの右クリックメニューに「新しいウィンドウで開く」が出てくると思います。
また、「HKEY_CLASSES_ROOT\Drive\shell」でも同様にすると
ドライブに対しても、「新しいウィンドウで開く」が適用されます。

自動の場合
以下をコピペして、テキストエディタに貼り付けて、拡張子を「.reg」にし、
そのファイルをダブルクリックすると登録できます。
######以下 コピペ文######
Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\OpenNew]
@=”新しいウィンドウで開く”

[HKEY_CLASSES_ROOT\Directory\shell\OpenNew\command]
@=”explorer %1″

[HKEY_CLASSES_ROOT\Drive\shell\OpenNew]
@=”新しいウィンドウで開く”

[HKEY_CLASSES_ROOT\Drive\shell\OpenNew\command]
@=”explorer %1″
#######ここまで#######

コマンドライン引数を取得する場合には、Main関数を以下のように 記述すると取得することができる

  1.  
  2. //引数ひとつで、フラグのON・OFFを指定する
  3. //Form1のコンストラクタでそのフラグを取得するようにしている
  4. static void Main(string[] args)
  5. {
  6.     Application.EnableVisualStyles();
  7.     Application.SetCompatibleTextRenderingDefault(false);
  8.     bool flag = false;
  9.     if (args.Length > 0 && args[0] == "1")
  10.     {
  11.          flag = true;
  12.     }
  13.     else
  14.     {
  15.           flag = false;
  16.     }
  17.     Application.Run(new Form1(flag));
  18. }
  19.  

以前書いた記事ファイルのMD5を取得する(お手軽)
を書いたが、この方法ではUNCパスで指定されるネットワークフォルダのファイルで大きいサイズ(700MBぐらい)の場合
かなりの時間がかかった。

なんとなく、一度メモリ等に展開してから計算しているようにみえるので、
転送時間+展開時間+計算時間がかかってしまっているのだと思った。

昔、Macで作ったソースを思い出して、
バッファに読み込んで、順次計算していく方法にしてみたところ
転送時間+αぐらいで計算できたので、
その方法をメモ

  1.  
  2. public string calcMD5(string path)
  3. {
  4.     string res = "";
  5.  
  6.     FileStream fs = new FileStream(path, FileMode.Open);
  7.  
  8.     MD5 crypto = new MD5CryptoServiceProvider();
  9.     long length = fs.Length;
  10.     int blockSize = 1024*1024*10;
  11.  
  12.     for (long offset = 0; offset < length; offset += blockSize)
  13.     {
  14.         byte[] byteValue = new byte[blockSize];
  15.         fs.Position = offset;
  16.         fs.Read(byteValue, 0, blockSize);
  17.         if (offset + blockSize < length)
  18.         {
  19.             crypto.TransformBlock(byteValue, 0, blockSize, null, 0);
  20.         }
  21.         else
  22.         {
  23.             crypto.TransformFinalBlock(byteValue, 0, (int)(length - offset));
  24.         }
  25.      }
  26.      fs.Close();
  27.  
  28.      byte[] hashValue = crypto.Hash;
  29.  
  30.      StringBuilder hashedText = new StringBuilder();
  31.      for (int i = 0; i < hashValue.Length; i++)
  32.      {
  33.          hashedText.AppendFormat("{0:x2}", hashValue[i]);
  34.      }
  35.  
  36.      res = hashedText.ToString();
  37.            
  38.      return res;
  39. }
  40.  
  41.  

ローカルのファイルの場合は、あまり変わらないので、
特にこの方法は取らなくていいかも

ファイルのデータを保証するために
ファイルのMD5を取得したいときの処理

  1.  
  2. using System.Security.Cryptography;
  3.  
  4. static public string calcMD5(string path)
  5. {
  6.     string res = ""; //結果が入る変数
  7.            
  8.     FileStream fs = new FileStream(path, FileMode.Open);
  9.     //MD5取得
  10.     res = BitConverter.ToString(MD5.Create().ComputeHash(fs)).ToLower().Replace("-", "");
  11.     fs.Close();
  12.  
  13.     return res;
  14. }
  15.  

参考にさせていただいたページ

ファイルのMD5チェックサムをとる-tsucchiの日記

アプリケーションの開発を行っていると、
2重起動防止の処理が必要な場合がある。
ただ、2重起動防止機能をつけて、
もし2重起動だった場合に、「すでに起動しています」というメッセージを
だすだけだとしたら、かなりしょぼい気がする。
それだったら、すでに起動しているアプリをアクティブにしてあげた方が
いい気がする。
(基本Machintoshはそうなってるし)

方法としては、外部アプリをアクティブにするためのメソッドが
VBに存在しているので、参照を追加し、
AppActiveを呼んでやればよい。

  1.  
  2. using System.Diagnostics;
  3. using Microsoft.VisualBasic;
  4.  
  5. static void Main(){
  6.     //2重起動防止
  7.     Process[] processList = Process.GetProcessesByName(
  8.                                       Process.GetCurrentProcess().ProcessName);
  9.     if (processList.Length > 1){
  10.        foreach (Process process in processList)
  11.        {
  12.                if (process.Id != Process.GetCurrentProcess().Id)
  13.                {
  14.                    //アクティブにして終了
  15.                    Interaction.AppActivate(process.Id);
  16.                    return;
  17.                }
  18.         }
  19.         //アクティブにせずに終了
  20.         return;
  21.     }
  22.  
  23.     Application.Run(new Form1());
  24. }
  25.  

起動したアプリと同じプロセス名からプロセスの一覧を取得し、
その中に、自分以外のプロセスがあったら、
そのプロセスに対して、Active命令を送る