コマンドバーにボタンを追加

Windows7のコマンドバーネタ(備忘録)です(^^ゞ

会社のPCがやっとXPからWindows7になりました。ええ、やっとです。XPのサポートが完全に終了したので、たぶん、仕方なくです(笑) どうせなら、Windows8.1にして欲しいものです。

さて、Windows8以降はエクスプローラシェルにもリボンUIが採用され、Vista/7のフォルダウィンドウの上部にくっついていたコマンドバーが消えてしまいました。Windows8以降のフォルダウィンドウはなかなか使い勝手よく、色んな設定をわざわざコントロールパネルを辿らずとも変更できるのですが・・・Windows7ではその辺使い勝手が悪いです。まぁ、見た目は圧倒的にWindows7の方が好きなのですが・・・。

あ、そうそう、フォルダウィンドウ内で、CTRLキーを押しながらマウスホイールを回すとアイコンサイズが変わるって知ってました? おいら、今日初めて知った・・・。ちょー便利。

と、そんなことは、どーでもよく。。。

隠し属性のファイルの表示・非表示を簡単に切り替えるようにしたくて、コマンドバーにスクリプトを登録しました。
toggle

コマンドバーへのボタン追加は、3年ぐらい前にコマンドバーの記事を書いていたので、隠し属性のファイルの表示・非表示を行うスクリプトを書いて、レジストリに登録するだけ。

/*
  隠しファイルの表示・非表示トグル スクリプト
  ちょいと変更 at 2014/4/28
*/
(function()
{
  var wShell = WScript.CreateObject("WScript.Shell")

  try
    {
      var Key="HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Hidden";
      var Value = parseInt(wShell.RegRead(Key));

      // レジストリ・キー(Key)の値(Value)が、1の時は非表示、2の時は表示なので入れ替え。
      // ・・・逆だったっけ?ま、いいや。
      wShell.RegWrite(Key,(Value & 1) + 1,"REG_DWORD");

      //現在開いているフォルダウィンドウのコレクションを得る。
      var sWindows = WScript.CreateObject("Shell.Application").Windows();

      /*
      現在開いているフォルダの数だけ、ループを回して更新する。
      Itemメソッドで得られるオブジェクトはInternetExplorerオブジェクトなので、
      Refresh()メソッドで表示を更新させる(F5キーを押すのと同じ)。
      */ 
      var i = sWindows.Count - 1;
      while(i >= 0)
        sWindows.Item(i--).Refresh();
    }
  catch(e)
    {
      WScript.Echo(e);
    }
})(); 

レジストリへの登録は「エクスプローラー(Windows7)のコマンドバーにボタンを追加する」をご参考に。

HHKB Professonal 2 with AX Keyboard driver

メモです。

キーボードを 念願だった、PFU の Happy Hacking Keyboard Professional 2 に買い替えました。予算が足らなくて、Type-Sは見送りましたけど・・・。

前は日本語配列なLite版を使っていたんですが、とうとう買ってしまいました!この件は、余所のくだらない日記ブログに書いたので(^^;;;こっちでは、英語配列に変更したときの設定をメモ。

DSC00241

まず、キーボードのDIPスイッチにて、モード設定を Lite EXT.モードに。これで、ダイヤモンドキー(っていうのかな?)をWindowsキーに。それと、ALTキーとダイヤモンドキーを入れ替え。

あとは、PFUで配布されている、HHKBキー配列切替ツール で、まずはキー配列を英語配列に切替える。

で、そこで終わればいいんですが、IMEトグルが、英語配列だと、ALT + 「`」 なのでかなり不便。xkeymacsでcontrol + セミコロン に割り当ててるとは言え、たまにキーフックが効かなくときがあるので・・・、この際だから、右Altキーに[漢字]キーを割り当てる方法 に載っている方法で、右ALTキーにIMEトグルキーを割り当てることにした。

レジストリをいじる。HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\i8042prt\Parameters を開いて以下のキー・値に修正。

LayerDriver JPN  = kbdax2.dll
OverrideKeyboardIdentifier = AX_105KEY
OverrideKeyboardSubtype = 1

Windows2000/XPの頃の記事だけど、Windows7(64bit) でも問題無かった。この辺はほとんど変わってないんだなぁ。AXキーボード・・・残念ながら見たことない(^^ゞ

というわけで、かなり快適な入力環境が整いました(^^)

あとは・・・そうですね、PFUから Bluetooth版もしくは無線版のHHKB Pro が出ることを強く望んでます!!!

エクスプローラー(Windows7)のコマンドバーにボタンを追加する

東日本大震災の影響で Internet Explorer 9の日本語版リリースが延期されましたね。インターネット上のトラフィックが増えることによる影響を考慮してのことでしょうか。しょうがないですね。

さて、本題です。
(※注)かなり長文になります。間違い・勘違いがあると思うので、随時修正が入るかと思います。すみません。

Windows7のエクスプローラはXPのものとは違って、メニュー/ツールバーがデフォルトで非表示になってますね。その替わりにWindows7のエクスプローラには新しくコマンドバーっていうのがウィンドウの上部がついてます。

コマンドバー

正式名は確認してませんが・・・(たぶんコマンドバーで合ってるはず)、このコマンドバーを自由にカスタマイズできるツールがWindowsに標準ではありません。サードパーティー用にわざとそういうカスタマイズできる設定を提供しなかったのか、それとも、マイクロソフトはこのユーザーインターフェイスをあまりいじって欲しくないのか、理由は分かりませんが、カスタマイズできればそれに越したことはありません。

僕はここに、【コマンドプロンプト】ボタンを追加できれば・・・というのが今回の備忘録を書くきっかけです。

続きを読む

Windows7 SP1

先週Windows7 Service Pack 1がリリースされて、先日早速適用してました。

まず、SP1のディスクイメージをダウンロードしてDVDに焼いてからやろうかな・・・と思ったんだけど、Windows Server 2008R2とWindows7 用のものが一緒に入っているイメージしかなく、ファイルサイズもバカでかいので Windows Updateから直接適用させました。。。

これが、失敗の元。(ーー;;;

コントロールパネルから、Windows Updateを起動して、ダウンロードが始まりました。ファイルサイズは90MBぐらい・・・これぐらいなら、すぐ終わるでしょう・・・。

・・・30分経過・・・50%から全く進まない。・・・・1時間経過・・・ダウンロード、終わらん・・・1時間10分経過・・・・イライライライライライラ・・・・・

ん?もしかして・・・Security Essentials のリアルタイム保護を外さないといけないのか??? そうこうしているうちに、1時間30分経過。ダウンロードが終わる気配もなく、ハードディスクのアクセスランプがチカチカしっぱなし。。。

しびれをきらして、キャンセルボタンをクリック。はぁ・・・時間の無駄遣い・・・。

公開されているSP1のイメージファイル(ISOファイル)をダウンロード。ものの10分ほどで終了。どゆこと?(笑)
DVDに焼いてから、DVDに入っているSP1のインストーラを起動して適用したら、あっけなく終わった( ̄。 ̄;)

なんなんだよ、Windows Update・・・orz

SP1を適用して、再起動したら、あきらかにメモリの使用量が増えてました。普段なら起動直後のアイドル状態で、1.4GBくらいだったんですが・・・2GB超になってます・・・何回か再起動してたら元に戻りましたが・・・なんなんでしょうね・・・???

いいかげん、あたらしいPCがほちい。

ネットワークドライブとWebDAV over SSL

Windows7だとWebDAVをネットワークドライブとして割り当てることができるので、ログオン時はいつも再接続させたい・・・のですが、クライアント認証を使ってアクセスする関係上、自動的に再接続できません。「ログオン時に再接続する」にチェックを入れているのですが、「再接続できませんでした」とかなんとかいうメッセージが出てエラーになってしまいます。

というわけで、今まではデスクトップに、以下のようなコマンドファイルを置いてその都度ダブルクリックすることで回避してました。

;---- allocate_network_drive.cmd ----
net use M: https://webdav_over_ssl/my_folder/
start M:

ただ、ダブルクリックすると、コマンドプロンプトのウィンドウが出たりして、なんかスマートじゃありません。。。

net use なんちゃら の部分を、自前でコーディングすれば事足ります。幸いにも、Windows API には WNetAddConnection2() という便利なAPIがあるので、このAPIをコールすれば一発でできそうです(^^)

早速、C++超手抜きネットワークドライブ・クラスを書いてみました。今年から積極的にC#を使おうとか、宣言しながら、早速C++使ってます。すみません(笑) 直接API叩くのがカンタンなので・・・。

#pragma comment(lib,"mpr.lib")
/**********************************************************
 簡易ネットワークドライブ・クラス 
 NetworkDrive.h
***********************************************************/
#include <windows.h>
#include <strsafe.h>
#include <tchar.h>

class CNetworkDrive
{
private:
  PTSTR m_strURI;
  PTSTR m_strDevice;

public:
  //コンストラクタ&デストラクタ
  CNetworkDrive(PCTSTR uri,PCTSTR device)
    {
      m_strURI    = CreateAndCopyString(uri);
      m_strDevice = CreateAndCopyString(device);
    }
  virtual ~CNetworkDrive()
    {
      DestroyString(m_strURI);
      DestroyString(m_strDevice);
    }

  DWORD Allocate(bool bRemember = false)
    {
      NETRESOURCE NetResource = {0};

      NetResource.dwType       = RESOURCETYPE_DISK;
      NetResource.lpLocalName  = m_strDevice;
      NetResource.lpRemoteName = m_strURI;
      
      return WNetAddConnection2(&NetResource,NULL,NULL,CONNECT_INTERACTIVE | (bRemember ? CONNECT_UPDATE_PROFILE : 0));
    }
  
  DWORD Cancel(bool bUpdate = false,bool bForce = true)
    {
      DWORD dwFlags = bUpdate ? CONNECT_UPDATE_PROFILE : 0;
      BOOL bwForce = bForce ? TRUE : FALSE;

      return WNetCancelConnection2(m_strDevice,dwFlags,bwForce);
    }

//雑関数
private:
  static PTSTR CreateAndCopyString(PCTSTR src)
    {
      DWORD dwNum = 0;
      PTSTR dest = NULL;
      
      if((dwNum = lstrlen(src)) > 0)
        {
          dest = new TCHAR[dwNum+1];
          StringCchCopy(dest,dwNum+1,src);
        }
      
      return dest;
    }

  static void DestroyString(PTSTR str)
    {
      if(str)
        delete [] str;
    }
  
};

これを、使って、以下のようなテストコードで試してみたところ、うまく行きました。

#pragma comment(lib,"user32.lib")

#include <windows.h>
#include <tchar.h>
#include "NetworkDrive.h"

#define URI TEXT("https://my_webdav_site/my_folder/")
#define DEVICE TEXT("Z:")

//スタートアップ
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
  return MessageBox(NULL,
                    (CNetworkDrive(URL,DRIVE).Allocate() == NO_ERROR) ? TEXT("接続しました。") : TEXT("失敗ました。"),
                    TEXT("メッセージ"),
                    MB_OK);
}

最初、エラーで接続できなくてググっても分からず、全く原因が分からくて途方に暮れてたのですが・・・結局ドキュメントを見落としてました。。。英語なんでサラッと流し読みしたのが悪かった(^_^;)

WNetAddConnection2 APIに渡す最後の引数のフラグに、CONNECT_INTERACTIVE を指定していなかったのが原因でした。これを指定することで、クライアント証明書選択ダイアログ(っていうのかな?)が出て正常に認証が済み、無事ネットワークドライブを割り当てることができました。

やっぱりドキュメントはちゃんと読まないといけませんねぇ・・・