• 追加された行はこの色です。
  • 削除された行はこの色です。
#title(.NETプログラミング研究 第15号)

#navi(.NETプログラミング研究)

#contents

*.NETプログラミング研究 第15号 [#w7c00176]

**ピンポイントリンク [#q7089963]

***Windows98/Meでの.NET開発 [#p9fd682f]

#column(注意){{
この記事の最新版は「[[Windows98/Meでの.NET開発>http://dobon.net/vb/dotnet/links/win98.html]]」で公開しています。
この記事の最新版は「[[Windows98/Meでの.NET開発>https://dobon.net/vb/dotnet/links/win98.html]]」で公開しています。
}}

マイクロソフトのサイトにある「[[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 Framework SDKは使用できないが、「どぼん!の .NET Tips」の「[[インコードコンパイルを行う>https://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つの解決法があるとのことです。

+タブにある「ファイル」を閉じておく。
+ソースコードの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質問箱 [#h91f042e]

***アプリケーションを起動して、ウィンドウの位置とサイズを変更するには? [#k6fbc200]

#column(注意){{
この記事の最新版は「[[外部アプリケーションを起動して、ウィンドウの位置とサイズを変更する>http://dobon.net/vb/dotnet/process/movewindow.html]]」で公開しています。
この記事の最新版は「[[外部アプリケーションを起動して、ウィンドウの位置とサイズを変更する>https://dobon.net/vb/dotnet/process/movewindow.html]]」で公開しています。
}}

''質問:''

例えば、メモ帳を起動した後、メモ帳のウィンドウの位置と大きさを変えるにはどのようにすればよいのでしょうか?

''答え:''

メモ帳の起動はProcess.Startメソッドで行えますが、起動後のウィンドウのサイズと表示位置を変更するための機能は.NET Frameworkにはありません。

そこでウィンドウのサイズと表示位置を変更するために、Win32 APIのMoveWindow関数を使用することにします。MoveWindow関数では対象とするウィンドウのハンドルを指定する必要がありますが、これにはProcessクラスのMainWindowHandleプロパティの値を使うことにします。(MainWindowHandleプロパティの値が適当でない時は、FindWindow関数等により、目的のウィンドウのハンドルを取得する必要があります。)

メモ帳起動直後はメインウィンドウハンドルが作成されていない恐れがありますので、WaitForInputIdleメソッドにより待機した後にMainWindowHandleプロパティの値を取得します。WaitForInputIdleで待機しているため、実際にウィンドウの位置とサイズが変更されるまで、起動してからちょっと間が空きます。

Button1をクリックすると、メモ帳を起動し、そのウィンドウの位置を(0, 10)に、サイズを300x200に変更する例を以下に紹介します。

#code(vbnet){{
'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
}}

#code(csharp){{
//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]]

***フォームを表示させずにトレイアイコンを表示するには? [#qb9f85ce]

#column(注意){{
この記事の最新版は「[[フォームを表示させずにトレイアイコンを表示する>http://dobon.net/vb/dotnet/form/hideformwithtrayicon.html]]」で公開しています。
この記事の最新版は「[[フォームを表示させずにトレイアイコンを表示する>https://dobon.net/vb/dotnet/form/hideformwithtrayicon.html]]」で公開しています。
}}

''質問:''

アプリケーション起動時にフォームを表示させないで、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クラスだけを使用するという方法も考えられます。ただしこの方法は初心者にはお勧めできません。

**コメント [#rccb4a3d]
#comment

//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2003-08-25 (月) 06:00:00,DOBON!,2010-03-21 (日) 00:37:43,DOBON!)


[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]