web-dev-qa-db-ja.com

フォームなしで画面に描画する

C#フォームアプリケーションではなくC#コンソールを使用して、画面上に大きな白い長方形を作成することは可能ですか?

可能であれば、画面全体をカバーする必要があります。 System.Drawingを使用する必要があり、いくつかの手順を試してみましたが、実際には画面に何も印刷されません。

27
user1988147

方法1:Windows APIを呼び出す

System.DrawingSystem.Runtime.InteropServicesが必要です。プロジェクト参照を追加する必要がある場合があります。

using System.Runtime.InteropServices;
using System.Drawing;

P/Invokeを使用してクラスにメソッドを追加します

[DllImport("User32.dll")]
public static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("User32.dll")]
public static extern void ReleaseDC(IntPtr hwnd, IntPtr dc);

画面全体のGraphicsオブジェクトを取得し、長方形を描画します:

IntPtr desktopPtr = GetDC(IntPtr.Zero);
Graphics g = Graphics.FromHdc(desktopPtr);

SolidBrush b = new SolidBrush(Color.White);
g.FillRectangle(b, new Rectangle(0, 0, 1920, 1080));

g.Dispose();
ReleaseDC(IntPtr.Zero, desktopPtr);

この方法の問題は、画面がまったく更新された場合、長方形が上書きされ、ほとんどの実用的なアプリケーションに役に立たなくなることです。

方法2:ボーダレスフォームを作成する

前と同じように、プロジェクト参照が必要です。今回はSystem.Windows.Formsに。またSystem.Drawingも必要になります:

using System.Drawing;
using System.Windows.Forms;

新しいフォームを作成し、境界線を削除し、画面を埋めて、タスクバーの上に配置します。

Form f = new Form();
f.BackColor = Color.White;
f.FormBorderStyle = FormBorderStyle.None;
f.Bounds = Screen.PrimaryScreen.Bounds;
f.TopMost = true;

Application.EnableVisualStyles();
Application.Run(f);

これに関して考えられる問題は、ユーザーがウィンドウからAlt + Tabキーを押すだけで済むことです。より複雑なグラフィックスを行いたい場合は、 this のような描画コードを書く必要があります。フォームの背景を透明にするには、TransparentKeyBackolorと同じに設定します。

これらの両方を.NET 4.5とWindows 7でテストしたばかりなので、以前のバージョンでは異なる場合があります。詳細情報 here および here

54
Tharwen

はい、画面に描画することは可能ですが、一番上のボーダーレスフォームを使用する方が簡単かもしれません。

必要に応じてコンソールアプリケーションからこれを行うこともできます。ただし、必要なアセンブリを参照することを条件にすると、アプリケーションの存続期間中、コンソールウィンドウが画面に残ることになります。

this.TopMost = true;
this.FormBorderStyle = FormBorderStyle.None;

あるいは、Windowのインスタンスを作成し、その上でShowを呼び出すことができると思います。

別の質問に対するこの回答 は、GDI +呼び出しを使用して画面に直接描画する方法を説明しています。

6
Paul Ruane

私が質問を理解する方法、それはどんな意味のある方法でも本当に可能ではありません。プラットフォームでuser32.dllとgdi32.dllを呼び出し、メッセージループなどを使用して従来のWindows UIアプリケーションを実装できると思いますが、Formsを使用する方がはるかに簡単です。それができない理由は何ですか?