2011年1月31日月曜日

VB.netで常駐プログラム

VB.netで常駐プログラムを作ろうと思い立ったので実現方法を調べてみました。

サンプルソースコード


■ウィンドウの非表示■

標準ではフォームが表示されてしまうので、ShownイベントでVisibleにFalseを設定し、常に非表示にします。
Private Sub Form_Shown(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown

    Me.Visible = False

End Sub
 また、ShowInTaskbarプロパティにFalseを設定し、タスクバーに表示されないようにします。


■タスクトレイにアイコンを表示■

タスクトレイ(タスクバーの右端に並ぶアイコンのことです)にアイコンを表示する方法ですが、NotifyIconクラスを使用します。
使い方は簡単で、ツールボックスからフォームにNotifyIconを貼り付けるだけです。アイコンや表示するテキストはプロパティから変更できます。

NotifyIconのイベントではアイコンをクリックした場合のマウスイベントを拾えます。また、ContextMenuStripプロパティを使用すれば、右クリック時に表示するメニューを設定できます。サンプルでは終了のメニューを表示しています。

■デスクトップにウィンドウを張り付ける■

Win32APIをいくつか使用するとデスクトップに張り付いたウィンドウを表示できます。

以下のWin32APIを定義します。
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Integer) As Integer

Public Declare Function FindWindow Lib "USER32.DLL" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
Public Declare Function SetParent Lib "USER32.DLL" (ByVal hWndChild As Integer, ByVal hWndNewParent As Integer) As Integer
ウィンドウタイトルより”Program Manager”を検索し、親ウィンドウに設定します。
また、デスクトップ上のアイコンに隠れないように最前面に表示します。
Protected Sub SetFormPosDesktop(ByVal targetForm As Form)

    Dim hProgramManagerHandle As Integer
    hProgramManagerHandle = FindWindow(vbNullString, "Program Manager")
    Call SetParent(targetForm.Handle.ToInt32, hProgramManagerHandle)
    Call SetForegroundWindow(targetForm.Handle.ToInt32)
End Sub

試しにカレンダーのサンプルを作成してみました。
実行した画面はこんな具合です。
画像だとわかりにくいかもしれませんが、ウィンドウをアクティブにしてもデスクトップに張り付いています。


ソースコードとサンプルプログラムはこちら↓からダウンロードできます。
http://tecproglab.googlecode.com/files/Calendar.zip
開発環境:Windows 7, VS2005Pro

1 件のコメント:

  1. とても参考になりました。
    このサンプルにおいて、デスクトップ上のアイコンの
    裏に表示させる方法はあるのでしょうか?

    返信削除