┏第15号━━━━━━━━━━━━━━━━━━━━━━━━━━┓ ┃         .NETプログラミング研究         ┃ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜メニュー ■ピンポイントリンク ・Windows98/Meでの.NET開発 ■.NET質問箱 ・アプリケーションを起動して、ウィンドウの位置とサイズを変更す るには? ・フォームを表示させずにトレイアイコンを表示するには? 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 ─────────────────────────────── ■ピンポイントリンク ─────────────────────────────── ●Windows98/Meでの.NET開発 マイクロソフトのサイトにある「Microsoft .NET Framework SDK のリ リース情報」 http://www.microsoft.com/japan/msdn/netframework/downloads/sdk_readme.asp の「必要なシステム」によると、.NET Framework SDKでサポートされ ているプラットフォームとして、 「Microsoft Windows Millennium Edition (Windows Me) および Windows 98」 もちゃんとあります。しかし但し書きとして、 「Windows Me および Windows 98 は、実行環境としてのみサポートさ れます。SDK はこれらのプラットフォームでは実行できませんが、 .NET Framework を使用して、これらのプラットフォームで実行可能な アプリケーションをビルドできます。」 とあります。つまりこれはWindows98/Meでは.NET Framework SDKは使 用できないが、「どぼん!の .NET Tips」の「インコードコンパイル を行う」 http://dobon.net/vb/dotnet/programing/incodecompiler.html で紹介したような方法によりビルドは出来るということのようです。 よって、自分でこのようなアプリを作成すれば、Windows98/Meでも. NET開発が可能になりそうです。しかしこれはあまりに面倒です。すで にそのようなアプリを誰かが作っていてくれていれば良いのですが...。 実は前回紹介したオープンソースの.NET開発環境「SharpDevelop」が それです。SharpDevelopはWindows98/Meをサポートしていませんが、 動くがどうか確かめてみる価値はあります。 ・SharpDevelop http://www.icsharpcode.net/OpenSource/SD/ というわけで、早速Windows98(バージョン:4.10.1998)にインストール してみることにします。.NET Framework SDKのインストールはできな いので、.NET Framework 1.1のみをWindows Updateでインストールし た後、SharpDevelop 0.95をインストールしました(SharpDevelopは 2003/08/23に0.96へバージョンアップしました)。また、 SharpDevelop-jpの修正パッケージも入れました。 ・SharpDevelop-jp http://sharpdevelop-jp.sourceforge.jp/index?FrontPage インストール、起動、プロジェクトのビルドとすべてが異常なくうま く行きました。特に問題はないようです。...と思ったところ、 SharpDevelop終了時にエラー(System. PlatformNotSupportedException)が出ました。このエラーが出たから といって、特に不都合はないようなので、これはこれでいいかとも思 いましたが、調べてみたところ、回避法がありました。SharpDevelop のフォーラムによると、次のような2つの解決法があるとのことです。 1.タブにある「ファイル」を閉じておく。 2.ソースコードのFileSystemWatcherをすべて削除し、コンパイルし直 す。 ・#develop Community Forum - Crash when closing down on Windows 98 http://www.icsharpcode.net/opensource/sd/forum/topic.asp?TOPIC_ID=2432 実際メニュー「表示」の「ファイル」によりファイルタブを非表示に すると、このエラーは出なくなりました。 さてこれでどうやらSharpDevelopはWindows98/Meでも使えそうだとい うことが分かりましたが、SharpDevelopにはデバッガが付いていない という難点があります。どうにかならないものでしょうか? 実は、.NET Framework SDKをWindows98/Meにインストールすることは 出来ませんが、そこに含まれるツールの中には、Windows98/Meでも動 くものもあるようです。試しにcsc.exeやvbc.exe、WinRes.exeなどを Windows98で動かしてみると、これらはちゃんと動きました。果たして デバッガDbgCLR.exeは動くでしょうか? 残念ながら私はDbgCLR.exeをWindows98で起動されることは出来ません でした。何かファイルが足りないようですが、それが何なのか分かり ませんでした。コマンドラインのデバッガcordbg.exeは動くのですが、 ほとんど役に立たないでしょう。 デバッグが出来ないのはかなり厳しいですが、Windows98/Meユーザー が.NET開発をしたい時は、SharpDevelopを使わない手はないでしょう。 ─────────────────────────────── ■.NET質問箱 ─────────────────────────────── ●アプリケーションを起動して、ウィンドウの位置とサイズを変更する には? 質問: 例えば、メモ帳を起動した後、メモ帳のウィンドウの位置と大きさを 変えるにはどのようにすればよいのでしょうか? 答え: メモ帳の起動はProcess.Startメソッドで行えますが、起動後のウィン ドウのサイズと表示位置を変更するための機能は.NET Frameworkには ありません。 そこでウィンドウのサイズと表示位置を変更するために、Win32 APIの MoveWindow関数を使用することにします。MoveWindow関数では対象と するウィンドウのハンドルを指定する必要がありますが、これには ProcessクラスのMainWindowHandleプロパティの値を使うことにします。 (MainWindowHandleプロパティの値が適当でない時は、FindWindow関 数等により、目的のウィンドウのハンドルを取得する必要があります。) メモ帳起動直後はメインウィンドウハンドルが作成されていない恐れ がありますので、WaitForInputIdleメソッドにより待機した後に MainWindowHandleプロパティの値を取得します。WaitForInputIdleで 待機しているため、実際にウィンドウの位置とサイズが変更されるま で、起動してからちょっと間が空きます。 Button1をクリックすると、メモ帳を起動し、そのウィンドウの位置を (0, 10)に、サイズを300x200に変更する例を以下に紹介します。 '[VB.NET]・・・・・・・・・・・・・・・・・・・・・・・・・・ 'MoveWindow関数の宣言 Private Declare Function MoveWindow Lib "user32" Alias "MoveWindow" _ (ByVal hwnd As IntPtr, ByVal x As Integer, ByVal y As Integer, _ ByVal nWidth As Integer, ByVal nHeight As Integer, _ ByVal bRepaint As Integer) As Integer Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click 'メモ帳を起動 Dim p As System.Diagnostics.Process = _ System.Diagnostics.Process.Start("notepad.exe") 'アイドル状態になるまで待機 p.WaitForInputIdle() 'ウィンドウの位置を(0, 10)に、サイズを300x200に変更する MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1) End Sub '・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //[C#]・・・・・・・・・・・・・・・・・・・・・・・・・・・・ //MoveWindow関数の宣言 [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern int MoveWindow(IntPtr hwnd, int x, int y, int nWidth,int nHeight, int bRepaint); private void button1_Click(object sender, System.EventArgs e) { //メモ帳を起動 System.Diagnostics.Process p = System.Diagnostics.Process.Start("notepad.exe"); //アイドル状態になるまで待機 p.WaitForInputIdle(); //ウィンドウの位置を(0, 10)に、サイズを300x200に変更する MoveWindow(p.MainWindowHandle, 0, 10, 300, 200, 1); } //・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ ・旧どぼん!のVB道 - ウィンドウのサイズ及び表示位置 http://www.sky-j.com/viewlist.php?arg_forum_id=38&arg_thread_id=824&arg_message_id=824 ─────────────────────────────── ●フォームを表示させずにトレイアイコンを表示するには? 質問: アプリケーション起動時にフォームを表示させないで、NotifyIconコ ンポーネントを使用してタスクトレイにアイコンを表示したいのです が、うまく行きません。どのようにすればよいでしょうか? 答え: NotifyIconコンポーネントをフォームに貼り付けてタスクトレイにア イコンを表示する時は当然フォームのインスタンスが必要となります が、アプリケーションの起動時にメインフォームのVisibleプロパティ をFalseにしてもフォームは表示されてしまいます。 この問題を解決するサンプルがないものかと探したところ、マイクロ ソフトの配布した「.NET なんでだろ? CD-ROM」内の「Visual Studio .NET Family製品 サンプル プログラム」に「Windowsシステム トレイ サンプル(Windows System Tray Sample)」というのがありまし た。このサンプルでは、フォームのコンストラクタに Me.Hide() とあるのですが、これは全く意味がなく、実際にはフォームの Opacityプロパティを0とすることにより、非表示にしているようです。 ところがOpacityプロパティはWindows98/Meでは対応していないため、 この方法ではWindows98/Meではフォームが表示されてしまうはずです。 この方法はWindows98/Meは全く無視しているようです。 私がお勧めするのは、起動時のフォームの状態を最小化にして、さら にタスクバーに表示させないように設定しておくという方法です。つ まり、フォームのプロパティの「WindowState」を「False」、「 ShowInTaskbar」を「False」にしておきます。これで見た目には起動 時にフォームが表示されないようになるでしょう。 ・旧どぼん!のVB道 - アプリケーション開始時にフォームを非表示にする http://www.sky-j.com/viewlist.php?arg_forum_id=38&arg_thread_id=816&arg_message_id=816 もしフォームが全く必要ないということであれば、NotifyIconコンポー ネントをフォームに貼り付けるのではなく、NotifyIconクラスだけを 使用するという方法も考えられます。ただしこの方法は初心者にはお 勧めできません。 =============================== ■このマガジンの購読、購読中止、バックナンバー、説明に関しては  次のページをご覧ください。  http://www.mag2.com/m/0000104516.htm ■発行人・編集人:どぼん!  http://dobon.net  dobon@bigfoot.com ■ご質問等はメールではなく、掲示板へお願いいたします。  http://dobon.net/bbs ■上記メールアドレスへのメールは確実に読まれる保障はありません  (スパム、ウィルス対策です)。メールは下記URLのフォームメール  から送信してください。  http://dobon.net/mail.html Copyright (c) 2003 DOBON! All rights reserved. ===============================