2009/08/15

イマイチ注目度の低いガジェットですが、Windows Vista→7でかなり変更があります。まだ開発までは追いきれてないのですが、とりあえず使用方法について気付いたことをメモ。

  Windows サイドバー ガジェット Windows デスクトップ ガジェット
OS Windows Vista Windows 7
デフォルト表示位置 デスクトップの左右どちらか(マルチディスプレイ環境ではいずれか一つのディスプレイ) デスクトップの任意の場所。ただし、デスクトップの左右には目に見えないグリッドがあり、マウスでD&Dすると位置補正がかかる。(シフトキーを押しながらだと補正はかからない)
整列 左右に格納(Docked)時は自動整列 自動整列なし
マルチページ 左右に格納時、はみ出したガジェットは2ページ目以降に表示される マルチページ機能なし
ショートカットキー

Windowsキー+スペースキーで手前に表示
Windowsキー+Gでガジェットの選択

Windowsキー+Gでガジェットの選択
のみ (8/19修正。JZ5さん komvoyさんありがとうございます)

ガジェットの大きさ Docked時は小さいサイズ、unDocked(デスクトップの任意の場所に配置)時は大きいサイズ ガジェットの右上に表示されるボタンで小さいサイズと大きいサイズのいずれかを選択できる
ガジェットの最小サイズ 130 x 55px なし?
起動方法 スタートメニュー→「すべてのプログラム」→「アクセサリ」→「Windows サイドバー」から起動 デスクトップを右クリックし、「表示」→「デスクトップ ガジェットの表示」にチェック
終了方法 通知領域(タスクトレイ)のアイコンの右クリックメニュー デスクトップを右クリックし、「表示」→「デスクトップ ガジェットの表示」のチェックをはずす
ガジェットの追加 サイドバーの上の+ボタンクリック デスクトップを右クリックして「ガジェット」をクリック
なんか、微妙に機能が削られてるというかなんというか…あと、デスクトップ右に並べた時に右にできるスペースが妙に広い。まぁアイコンが大きくなったせいなんでしょうが… 元記事:http://blogs.wankuma.com/mutaguchi/archive/2009/08/15/180164.aspx

2006/07/14

.NET Framework 2.0にはタスクトレイにアイコンを表示させるためのクラス、NotifyIconクラスがあります。これを使ってみましょう。

function CreateNotifyIconMenu()
{
 # menuItem1オブジェクトの作成
 $menuItem1 = new-object System.Windows.Forms.MenuItem("終了(&X)")
 
 # Clickイベント
 $menuItem1.Add_Click({Form_Closing})
 
 # contextMenuオブジェクトの作成
 $contextMenu = new-object System.Windows.Forms.ContextMenu
 
 # menuItemオブジェクトをcontextMenuオブジェクトのMenuItemsコレクションに追加
 [void]$contextMenu.MenuItems.Add($menuItem1)
 #↑ここの[void]を忘れるとAddメソッドの戻り値がreturnされてしまう。
 
 return ($contextMenu)
}
function Form_Closing()
{
 # フォームとシステムトレイアイコンを非表示に
 $form.Visible = $false
 $notifyIcon.Visible = $false
 
 # PowerShellの終了
 [System.Environment]::Exit(0)
}
[void] [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[void] [System.Windows.Forms.Application]::EnableVisualStyles()
# notifyIconオブジェクトの作成とプロパティの設定
$notifyIcon = new-object System.Windows.Forms.NotifyIcon
# System.Drawing.Iconクラスのコンストラクタにはicoファイルのパスを指定する
$notifyIcon.Icon = new-object System.Drawing.Icon C:\script\test\a.ico
$notifyIcon.Text = "PowerShell実行中"
$notifyIcon.ContextMenu = CreateNotifyIconMenu
$notifyIcon.Visible = $true
# formオブジェクトの作成
$form = new-object System.Windows.Forms.Form
# Closingイベント
$form.Add_Closing({Form_Closing})
# フォームの表示
[void]$form.showDialog()

理論上はフォームを表示させなくても良いはずなんですが、ループをまわすいい方法が思いつきませんでした(start-sleepを使うとその間イベントが実行されない)。あと、showDialogで表示したフォームを閉じるいい方法も思いつかなかったので[System.Environment]::Exit(0)
としてPowerShell自体のプロセスを終了させています(exitとやるとエラーが出るんですよね。なんでしょうこれは)。これらに対する良い解決策をお持ちの方は教えてください。

PowerShellのfunctionって引数がなしのとき、呼び出す際()を使うとエラーになるんですよね。あと、文頭に持ってこないといけないのも気に入りません。何とかならなかったのでしょうか…。

せっかくタスクトレイが使えるのに、フォームとコンソールまで表示されてしまいます。そこでWSHを併用してごまかす方法を。

Set WshShell=CreateObject("WScript.Shell")
WshShell.Run "powershell test.ps1",0

このようなvbsファイルを作ってps1ファイルをキックしてやります。Runメソッドの第二引数に0を指定すると、コンソールおよびフォームが非表示になりますが、タスクトレイは表示されます。この手を使うとまるでタスクトレイだけが表示されているかのような状態を作り出せます。ちなみに、MessageBoxも同じようにそれだけを表示させることができます。

元記事:http://blogs.wankuma.com/mutaguchi/archive/2006/07/14/32470.aspx


Copyright © 2005-2018 Daisuke Mutaguchi All rights reserved
mailto: mutaguchi at roy.hi-ho.ne.jp
プライバシーポリシー

Awards

Books

Twitter