http://msdn.microsoft.com/ja-jp/library/cc364423.aspx を見てもWindowsキーがどういう文字列を送ればいいのか載っていない。
いろいろ調べ回ってようやく分かった。
「Windows」キーは「CTRL」+「ESC」キーの組み合わせだった。
つまりCTRLキーは「^」でESCキーは「{ESC}」なので、SendKeys.Send("^{ESC}") となる。
2012年11月28日
2012年09月11日
32/64bit両方でネイティブに動作するプログラムを作る
今まで32bitか64bitか意識しなくてもちゃんと64bit版OSで動いていたのだが、ある時レジストリの編集をしていてどういうわけか64bit版Windows7で更新されていないのに気が付いた。全てのレジストリではない、ある特定のレジストリである。なぜ更新されないのか調べていくうちに、意外なことが判った。
実は更新されていないのではなく、別のところに更新されていたのだ。
もともと更新したかったのは
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.....だった。
ところが実際に更新されていたのは
\HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\Microsoft\.....だった。
原因はプログラムが32bit用アプリケーションだったためだった。
このレジストリはどうやら64bit用アプリでないと本来の場所に書き込まないらしい。
そこで64bit用にコンパイルし直す必要が出てきたのだが、32bitと64bit別々に作るのは煩わしい。
調べてみると両方で動作するコンパイル方法があることが判った。
ビルドメニューの「構成マネージャ」からプラットフォームで「Any CPU」を指定すればいいのである。

64bit対応アプリの作成方法の参考ページ
http://code.msdn.microsoft.com/windowsdesktop/10-64-NET-VB-ae70ffc1
ここには以下の表が掲載されている。これで一目瞭然。

実は更新されていないのではなく、別のところに更新されていたのだ。
もともと更新したかったのは
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.....だった。
ところが実際に更新されていたのは
\HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\Microsoft\.....だった。
原因はプログラムが32bit用アプリケーションだったためだった。
このレジストリはどうやら64bit用アプリでないと本来の場所に書き込まないらしい。
そこで64bit用にコンパイルし直す必要が出てきたのだが、32bitと64bit別々に作るのは煩わしい。
調べてみると両方で動作するコンパイル方法があることが判った。
ビルドメニューの「構成マネージャ」からプラットフォームで「Any CPU」を指定すればいいのである。
64bit対応アプリの作成方法の参考ページ
http://code.msdn.microsoft.com/windowsdesktop/10-64-NET-VB-ae70ffc1
ここには以下の表が掲載されている。これで一目瞭然。
2012年09月07日
起動時にフォームを表示せず、タスクトレイ(通知領域)にアイコン表示させる
ずっと以前「VB.NETではForm1(最初に起動させるフォーム)を非表示で起動できない?」というTipsを紹介した。ところがVB2010ではこの方法でもフォームが小さく表示してしまうことが判明、別の対策をすることになった。
今回の見つけた方法はvb2005〜2010全てで動作する。(初期vb.netやvb2003は開発環境が無いため確認不能)
デザイン時のForm1のプロパティ設定は以下の3つ
・Opacity = 0
・ShowInTaskbar = False
・WindowState = Minimized 'これはForm_Loadイベント内でも可
実行時のイベントでの処理
このTipsの肝要はOpcityの使用である。コントロールの不透明度を利用して見えなくするのだ。
今回の見つけた方法はvb2005〜2010全てで動作する。(初期vb.netやvb2003は開発環境が無いため確認不能)
デザイン時のForm1のプロパティ設定は以下の3つ
・Opacity = 0
・ShowInTaskbar = False
・WindowState = Minimized 'これはForm_Loadイベント内でも可
実行時のイベントでの処理
Private Sub NotifyIcon1_Click(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles NotifyIcon1.Click
Me.WindowState = FormWindowState.Normal
End Sub
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) _
Handles Me.Resize
If Me.WindowState = FormWindowState.Minimized Then
Me.Opacity = 0
Else
Me.Opacity = 100
End If
End Sub
このTipsの肝要はOpcityの使用である。コントロールの不透明度を利用して見えなくするのだ。
2012年08月16日
Windows7 + Visual Basic 2010 でサービスプログラムの開発覚書
以前VB2005でサービスプログラムを作ったことがある。その時にデバッグについてのTipsを書いたが今回はそれ以前のサービスとして動作させるための初歩的な躓きについてのTipsである。
今回VB2010用の参考書「Visual Basic 2010 逆引き大全555」を使ってサンプルをテストした。
サンプルをそのままビルドし、InstallUtilを使いインストールしてちゃんと登録されている。(下図)


ここで「開始」を選択するが「サービスを開始できません」と下図のようなエラーになる。


何がいけないのか散々調べてようやく判ったのは、実行させているプログラムのあるフォルダのアクセス権にサービスの実行アカウントに指定した「Local Service」が無いからだった。(下図)

これを割り当てることで無事サービスが開始された。(下図)

今回VB2010用の参考書「Visual Basic 2010 逆引き大全555」を使ってサンプルをテストした。
| Visual Basic 2010逆引き大全555の極意―Windows 7/Vista完全対応 | |
![]() | 池谷 京子 国本 温子 増田 智明 秀和システム 2010-11 売り上げランキング : 43124 Amazonで詳しく見るby G-Tools |
サンプルをそのままビルドし、InstallUtilを使いインストールしてちゃんと登録されている。(下図)
ここで「開始」を選択するが「サービスを開始できません」と下図のようなエラーになる。
何がいけないのか散々調べてようやく判ったのは、実行させているプログラムのあるフォルダのアクセス権にサービスの実行アカウントに指定した「Local Service」が無いからだった。(下図)
これを割り当てることで無事サービスが開始された。(下図)
2011年12月26日
VS2010にServicePack1を適用するとByValが付加されなくなる
今日何気なしにコードを書いていたらパラメータの定義の際、ByValが表示されていないことに気が付いた。
これまで入力しなくても勝手に付加されたのに何でだろう?って思って調べてみたらServicePack1を適用するとそうなるらしい事が判った。
VB6までは指定しなければ既定でByRefだったが、VS2010 SP1からそれがByValになったわけか(注)・・・何か違和感(喪失感)感じるな〜。
注)VB.NETになってから既定でByValとは知っていたが、勝手に付加されているので既定であることを自覚することは無かった。
これまで入力しなくても勝手に付加されたのに何でだろう?って思って調べてみたらServicePack1を適用するとそうなるらしい事が判った。
VB6までは指定しなければ既定でByRefだったが、VS2010 SP1からそれがByValになったわけか(注)・・・何か違和感(喪失感)感じるな〜。
注)VB.NETになってから既定でByValとは知っていたが、勝手に付加されているので既定であることを自覚することは無かった。
2011年09月09日
VS2005からSQLServer2008R2に接続できない
VB2005の開発環境でサーバーエクスプローラを開き、SQLServer2008R2を稼動しているPCに接続しようとしたところ「接続の確認」ボタンでは問題なかったのに「OK」ボタンをクリックした途端、下図のようなエラー「このバージョンのサーバーはサポートされていません・・・」が発生した。

今までバージョンが違っても使えたと思ったのに変だ・・・と思って調べたところパッチが出ていることを知った。
「Microsoft SQL Server 2008 サポート用 Microsoft Visual Studio 2005 Service Pack 1 更新プログラム 」
今までバージョンが違っても使えたと思ったのに変だ・・・と思って調べたところパッチが出ていることを知った。
「Microsoft SQL Server 2008 サポート用 Microsoft Visual Studio 2005 Service Pack 1 更新プログラム 」
Office アプリケーションの組み込み定数の値を取得する方法
WindowsおよびWebアプリのなかでExcelなどを操作することがある。
その際にVBAを利用するのだが、参考書などにはコマンドの引数に定数が使われても、実際のVBのなかでは定数が利用できないことの方が多い。
そこで、定数の実際の数値を知りたいと思うのだがこれが結構調べても載っていない。
そんな時Microsoftの下のサイトを見つけた。
「Office アプリケーションの組み込み定数の値を取得する方法」
ここにはVB6のサンプルコードが載っている。
それに基づいて作ってみたところ全ての組み込み定数の値を知ることができた。(下図)
これは重宝する。
その際にVBAを利用するのだが、参考書などにはコマンドの引数に定数が使われても、実際のVBのなかでは定数が利用できないことの方が多い。
そこで、定数の実際の数値を知りたいと思うのだがこれが結構調べても載っていない。
そんな時Microsoftの下のサイトを見つけた。
「Office アプリケーションの組み込み定数の値を取得する方法」
ここにはVB6のサンプルコードが載っている。
それに基づいて作ってみたところ全ての組み込み定数の値を知ることができた。(下図)
これは重宝する。
2011年09月05日
Windows CE のデバッグができなくなった理由
Visual Studio 2005 を使って Windows CE の開発を続けていたのだが、途中でVS2008,VS2010の開発環境を導入したところ、いつのまにかWindows CEのデバッグ時にActiveSyncで繋がれた端末側でエラーが発生しデバッグが出来なくなってしまった。
あれこれ調査した結果、プロジェクトのプロパティの「デバイス」にある「配置オプション」の「Service Pack を含む最新バージョンの .NET Compact Framework を配置」を無効にすると正常にデバッグできようになった。
以前はVS2005だけの環境だったので有効になっていても問題が起きなかっただけだと分かった。
あれこれ調査した結果、プロジェクトのプロパティの「デバイス」にある「配置オプション」の「Service Pack を含む最新バージョンの .NET Compact Framework を配置」を無効にすると正常にデバッグできようになった。
以前はVS2005だけの環境だったので有効になっていても問題が起きなかっただけだと分かった。
2011年08月05日
webサーバーでデバッグを開始できません
WindowsXPでVisual Studio 2010を使ってWebアプリを作成中、途中からIISを入れてWebサーバ上でデバッグしようとしたところ、「webサーバーでデバッグを開始できません」というエラーが出た。(下図)

散々調べまわった挙句、ヘルプに書かれた次の一言で原因が判明。
「ローカル コンピューター (Visual Studio を実行するコンピューター) で、Visual Studio をインストールした後に IIS をインストールしましたか。 IIS は、Visual Studio の前にインストールする必要があります。 後でインストールすると、ASP.NET の再登録が必要になることがあります。 」
ASP.NETを再登録するには
コマンド プロンプト ウィンドウで、「systemroot\Microsoft.NET\Framework\ versionNumber \aspnet_regiis -i」というコマンドを実行します。 (下図)

これで無事デバッグができるようになった。...確か以前にも同じ羽目に陥ったと記憶している(^^;
散々調べまわった挙句、ヘルプに書かれた次の一言で原因が判明。
「ローカル コンピューター (Visual Studio を実行するコンピューター) で、Visual Studio をインストールした後に IIS をインストールしましたか。 IIS は、Visual Studio の前にインストールする必要があります。 後でインストールすると、ASP.NET の再登録が必要になることがあります。 」
ASP.NETを再登録するには
コマンド プロンプト ウィンドウで、「systemroot\Microsoft.NET\Framework\ versionNumber \aspnet_regiis -i」というコマンドを実行します。 (下図)
これで無事デバッグができるようになった。...確か以前にも同じ羽目に陥ったと記憶している(^^;
2011年08月01日
IPアドレスの取得時の注意
FTPクライアントを作った時、WindowsXPの開発環境では問題なく動作していたのが、本番環境のWindowsServer2008ではハングアップしてしまった。最初はファイヤーウォールが問題かと考えいろいろ設定したのだが一向に解消されない。
仕方なく本番環境と同じWindowsServer2008にVisualStudioをインストールして動作確認したところ、やっと原因が判明した。
問題は自分のIPアドレスを取得する際の Dns.GetHostEntry(Dns.GetHostName()).AddressList(0) に問題があった。
XPまでなら、IPアドレスはIPv4つまり、192.168.0.0などで表現されるIPアドレスが取得されるが、Vista以降ではネットワークアダプタにIPv6のインターネットプロトコルが標準で有効になっているのでAddressList(0)ではIPv4ではなくIPv6のアドレスが取得されてしまうからだった。
そこでIPv4を確実に取得するように以下の修正が必要になる。
(Imports System.Net を忘れずに)
AddressFamilyを調べることでIPv4かIPv6か判定できる。
・IPv4=Sockets.AddressFamily.InterNetwork
・IPv6=Sockets.AddressFamily.InterNetworkV6
仕方なく本番環境と同じWindowsServer2008にVisualStudioをインストールして動作確認したところ、やっと原因が判明した。
問題は自分のIPアドレスを取得する際の Dns.GetHostEntry(Dns.GetHostName()).AddressList(0) に問題があった。
XPまでなら、IPアドレスはIPv4つまり、192.168.0.0などで表現されるIPアドレスが取得されるが、Vista以降ではネットワークアダプタにIPv6のインターネットプロトコルが標準で有効になっているのでAddressList(0)ではIPv4ではなくIPv6のアドレスが取得されてしまうからだった。
そこでIPv4を確実に取得するように以下の修正が必要になる。
(Imports System.Net を忘れずに)
Dim ipa As IPAddress
Dim iphEntry As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName())
For Each ipAddr As IPAddress In iphEntry.AddressList
If ipAddr.AddressFamily = Sockets.AddressFamily.InterNetwork Then
ipa = ipAddr
Exit For
End If
Next
AddressFamilyを調べることでIPv4かIPv6か判定できる。
・IPv4=Sockets.AddressFamily.InterNetwork
・IPv6=Sockets.AddressFamily.InterNetworkV6


