无法在WinForms中的透明区域上接收WM_NCHITTEST

时间:2014-08-19 22:16:49

标签: c# .net winforms winapi wndproc

我有一个关于WinForms透明度的问题,但首先要做的事情。 我刚刚在WinForms中创建了一个带有透明“body”的超级简单应用程序。我只更改了默认表单的颜色。设计师代码:

partial class Form1
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        this.SuspendLayout();
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
        this.ClientSize = new System.Drawing.Size(538, 312);
        this.Name = "Form1";
        this.Text = "Form1";
        this.TransparencyKey = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(192)))), ((int)(((byte)(192)))));
        this.ResumeLayout(false);

    }

    #endregion


}

所以在运行时它基本上只是一个框架+标题。在Form1.cs中,我添加的唯一内容是覆盖了我所做的WndProc函数:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    protected override void WndProc(ref Message m)
    {
        const UInt32 WM_NCHITTEST = 0x0084;
        const UInt32 WM_MOUSEMOVE = 0x0200;

        if (m.Msg == WM_NCHITTEST || m.Msg == WM_MOUSEMOVE)
        {
            Point screenPoint = new Point(m.LParam.ToInt32());
            Point clientPoint = this.PointToClient(screenPoint);
            string position = "Position: X=" + clientPoint.X.ToString() + "; Y=" + clientPoint.Y.ToString();
            Console.WriteLine(position);
            this.Text = position;
        }

        base.WndProc(ref m);
    }
}

在我看来,它应该以这种方式工作:它只是在窗口标题中的窗口上显示鼠标指针位置。但是,什么是超级重要的 - 也应该显示在透明区域上的位置。我的应用程序窗口中的“表单”是透明的,但它仍然是我的应用程序的一部分,对吧?这就是我的问题,因为不是每台机器上的工作都是一样的。

有两种情况(相同的应用!!): 我可以点击我申请下的东西(通过这个透明区域) 窗户只是透明的。我不能点击像图标或透明区域下的任何东西。

在第一种情况下,在我的WndProc覆盖函数中根本不发送WM_NCHITTEST消息(在透明区域上)。透明区域(因此Form)在我的应用程序中实际上是一个洞。在第二种情况下,Form是透明的,但是在Window的标题中,我可以看到我的指针位置,所以简单地发送WM_NCHITTEST消息。

任何人都可以解释我哪里可能有问题?这是相同的应用程序。 我的意思是,如果你想创建一个带有“洞”或“玻璃”或“窗口”的应用程序?你必须以某种方式控制它..

0 个答案:

没有答案