2012年11月28日

SendKeysでWindowsキーを送るには

http://msdn.microsoft.com/ja-jp/library/cc364423.aspx を見てもWindowsキーがどういう文字列を送ればいいのか載っていない。
いろいろ調べ回ってようやく分かった。

「Windows」キーは「CTRL」+「ESC」キーの組み合わせだった。

つまりCTRLキーは「」でESCキーは「{ESC}」なので、SendKeys.Send("^{ESC}") となる。

posted by なっちゃん at 17:30| 静岡 ☀| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

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」を指定すればいいのである。
Any CPU

64bit対応アプリの作成方法の参考ページ
http://code.msdn.microsoft.com/windowsdesktop/10-64-NET-VB-ae70ffc1

ここには以下の表が掲載されている。これで一目瞭然。
AnyCPU

posted by なっちゃん at 19:09| 静岡 ☀| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

2012年09月07日

起動時にフォームを表示せず、タスクトレイ(通知領域)にアイコン表示させる

ずっと以前「VB.NETではForm1(最初に起動させるフォーム)を非表示で起動できない?」というTipsを紹介した。ところがVB2010ではこの方法でもフォームが小さく表示してしまうことが判明、別の対策をすることになった。

今回の見つけた方法は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の使用である。コントロールの不透明度を利用して見えなくするのだ。
posted by なっちゃん at 10:45| 静岡 ☀| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

2012年08月16日

Windows7 + Visual Basic 2010 でサービスプログラムの開発覚書

以前VB2005でサービスプログラムを作ったことがある。その時にデバッグについてのTipsを書いたが今回はそれ以前のサービスとして動作させるための初歩的な躓きについてのTipsである。
今回VB2010用の参考書「Visual Basic 2010 逆引き大全555」を使ってサンプルをテストした。
Visual Basic 2010逆引き大全555の極意―Windows 7/Vista完全対応
Visual Basic 2010逆引き大全555の極意―Windows 7/Vista完全対応池谷 京子 国本 温子 増田 智明

秀和システム 2010-11
売り上げランキング : 43124

Amazonで詳しく見る
by G-Tools
Visual Basic 2010パーフェクトマスター―Windows 7完全対応 Windows Vista/XP対応 (Perfect Master SERIES) Visual Basic 2010 逆引き大全 至高の技 データベース+印刷/帳票編 ゼロから学ぶ!実用Visual Basic 2010 (日経BPパソコンベストムック) VB.NET基礎学習Bible―270例題で学ぶプログラミングの散歩道 ステップアップVisual Basic 2010〜開発者がもう一歩上達するための必読アドバイス! (MSDNプログラミング)


サンプルをそのままビルドし、InstallUtilを使いインストールしてちゃんと登録されている。(下図)
InstallUtilでインストール

サービスに登録された

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

エラー発生

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

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

サービスが開始できた


posted by なっちゃん at 11:22| 静岡 ☀| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

2011年12月26日

VS2010にServicePack1を適用するとByValが付加されなくなる

今日何気なしにコードを書いていたらパラメータの定義の際、ByValが表示されていないことに気が付いた。
これまで入力しなくても勝手に付加されたのに何でだろう?って思って調べてみたらServicePack1を適用するとそうなるらしい事が判った。
VB6までは指定しなければ既定でByRefだったが、VS2010 SP1からそれがByValになったわけか(注)・・・何か違和感(喪失感)感じるな〜。

注)VB.NETになってから既定でByValとは知っていたが、勝手に付加されているので既定であることを自覚することは無かった。
posted by なっちゃん at 17:36| 静岡 ☀| Comment(0) | TrackBack(0) | ETC | このブログの読者になる | 更新情報をチェックする

2011年09月09日

VS2005からSQLServer2008R2に接続できない

VB2005の開発環境でサーバーエクスプローラを開き、SQLServer2008R2を稼動しているPCに接続しようとしたところ「接続の確認」ボタンでは問題なかったのに「OK」ボタンをクリックした途端、下図のようなエラー「このバージョンのサーバーはサポートされていません・・・」が発生した。

接続エラー

今までバージョンが違っても使えたと思ったのに変だ・・・と思って調べたところパッチが出ていることを知った。
Microsoft SQL Server 2008 サポート用 Microsoft Visual Studio 2005 Service Pack 1 更新プログラム
posted by なっちゃん at 15:18| 静岡 ☔| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

Office アプリケーションの組み込み定数の値を取得する方法

WindowsおよびWebアプリのなかでExcelなどを操作することがある。
その際にVBAを利用するのだが、参考書などにはコマンドの引数に定数が使われても、実際のVBのなかでは定数が利用できないことの方が多い。
そこで、定数の実際の数値を知りたいと思うのだがこれが結構調べても載っていない。

そんな時Microsoftの下のサイトを見つけた。
Office アプリケーションの組み込み定数の値を取得する方法

ここにはVB6のサンプルコードが載っている。
それに基づいて作ってみたところ全ての組み込み定数の値を知ることができた。(下図)
これは重宝する。
Excel2003の組み込み定数
posted by なっちゃん at 11:36| 静岡 ☔| Comment(0) | TrackBack(0) | ETC | このブログの読者になる | 更新情報をチェックする

2011年09月05日

Windows CE のデバッグができなくなった理由

Visual Studio 2005 を使って Windows CE の開発を続けていたのだが、途中でVS2008,VS2010の開発環境を導入したところ、いつのまにかWindows CEのデバッグ時にActiveSyncで繋がれた端末側でエラーが発生しデバッグが出来なくなってしまった。
あれこれ調査した結果、プロジェクトのプロパティの「デバイス」にある「配置オプション」の「Service Pack を含む最新バージョンの .NET Compact Framework を配置」を無効にすると正常にデバッグできようになった。
以前はVS2005だけの環境だったので有効になっていても問題が起きなかっただけだと分かった。
posted by なっちゃん at 14:32| 静岡 ☔| Comment(1) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする

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」というコマンドを実行します。 (下図)

ASP.NETの再登録

これで無事デバッグができるようになった。...確か以前にも同じ羽目に陥ったと記憶している(^^;

posted by なっちゃん at 20:22| 静岡 ☔| Comment(0) | TrackBack(0) | ASP.NET Tips | このブログの読者になる | 更新情報をチェックする

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 を忘れずに)

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
posted by なっちゃん at 17:43| 静岡 ☔| Comment(0) | TrackBack(0) | VB.NET Tips | このブログの読者になる | 更新情報をチェックする