0

私はこのコードを持っており、フォームを常に上に、透明にして、クリックスルーします。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.Runtime.InteropServices;

    namespace HyperBox
    {

public partial class Form1 : Form
{

    public Form1()
    {
        InitializeComponent();

        this.TopMost = true; // make the form always on top
        this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; // hidden border
        this.WindowState = FormWindowState.Maximized; // maximized
        this.MinimizeBox = this.MaximizeBox = false; // not allowed to be minimized
        this.MinimumSize = this.MaximumSize = this.Size; // not allowed to be resized
        this.TransparencyKey = this.BackColor = Color.Red; // the color key to transparent, choose a color that you don't use

        // Set the form click-through
        int initialStyle = GetWindowLong(this.Handle, -20);
        SetWindowLong(this.Handle, -20, initialStyle | 0x80000 | 0x20);
    }

    [System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
    static extern int GetWindowLong(IntPtr hWnd, int nIndex);





    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);


    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern bool SetLayeredWindowAttributes(IntPtr hwnd, uint crKey, byte bAlpha, uint dwFlags);


    [System.Runtime.InteropServices.DllImport("user32.dll")]
    static extern int SetParent(int hWndChild, int hWndNewParent);


    [DllImport("user32.dll", CharSet = CharSet.Auto)]
    public static extern IntPtr FindWindow(
     [MarshalAs(UnmanagedType.LPTStr)] string lpClassName,
     [MarshalAs(UnmanagedType.LPTStr)] string lpWindowName);
    [DllImport("user32.dll")]
    public static extern IntPtr SetParent(
     IntPtr hWndChild,      // handle to window
     IntPtr hWndNewParent   // new parent window
     );

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        // draw what you want
        e.Graphics.FillRectangle(Brushes.Red, new Rectangle((SystemInformation.WorkingArea.Width / 2) - 4, (SystemInformation.WorkingArea.Height / 2) - 20, 8, 40));
        e.Graphics.FillRectangle(Brushes.Red, new Rectangle((SystemInformation.WorkingArea.Width / 2) - 20, (SystemInformation.WorkingArea.Height / 2) - 4, 40, 8));


    }
    private void Form1_MouseMove(object sender, MouseEventArgs e)
    {

    }

    private void Form1_Paint(object sender, PaintEventArgs e)
    {

    }

    private void Form1_Load(object sender, EventArgs e)
    {

        IntPtr hwndf = this.Handle;
        IntPtr hwndParent = FindWindow("chrome.exe", null);
        SetParent(hwndf, hwndParent);



    }

}
    }

問題は、グラフィックを描画しても何も描画されないことです。座標が100〜前後の場合は動作します。しかし、上記の方法を実行しても何も起こりません。まったく、ピクセルすらありません。誰かがこれが起こっている理由を説明したり、固定スニペットを再投稿したりできますか、ありがとうございます。レイン

4

1 に答える 1

1

OnPaint画面ではなく、フォームのグラフィックスオブジェクトを提供します。フォームではなく、システムの作業領域に基づいて長方形を塗りつぶしています。長方形の座標を調整し、グラフィックを表示する場所にフォームを配置する必要があります。場所がの長方形(0, 0)は、フォームのクライアント領域の左上隅です。ClientRectangleまた、基本のFormクラスで公開されているを呼び出すことで、その長方形にアクセスできるはずです。

フォームの外側に描画する場合は、次の質問を参照してください。フォームの外側に描画/ペイント するフォームにペイントしたくない場合は、正しい方向から始めることができますが、フォームの位置とサイズを変更する方が簡単です。必要に応じて。

編集問題をデバッグするときに、少なくとも何らかの境界線を追加するのが賢明でしょう。これは、フォームが配置されている場所と、フォームが置かれているモニターを確認するのに役立ちます。次に、OnPaintでブレークポイントを設定するときに数値をチェックして、長方形が正しく作成されていることを確認できます。ただし、フォームのクライアント領域内でペイントしていることを確認すると、問題が解決するはずです。

于 2012-11-10T01:58:34.237 に答える