当背景窗口发送特定消息时,如何做“某事”

时间:2012-07-26 13:08:36

标签: c# .net winapi window wndproc

我试图在应用程序上做一些事情,我知道它的名字等...(所以我是alredy铸造findwindow和东西) 对于前者我想在该窗口试图获得焦点时通知用户。

我已经搞乱了wndproc,但我似乎根本没有得到它。 对于前这是我在stackoverflow上找到的代码,甚至执行它都失败了

    public IntPtr WndProc(int hwnd, int msg, IntPtr wParam, IntPtr lParam)
    {

        if (msg == WM_NCACTIVATE)
        {
            SystemSounds.Beep.Play();
            SystemSounds.Beep.Play();
            SystemSounds.Beep.Play();
            SystemSounds.Beep.Play();
            SystemSounds.Beep.Play();
        }

        return IntPtr.Zero;
    }

现在我不理解的是,我认为有一个int msg代表消息。不是wndproc应该得到它吗?把它交给wndproc有什么意义?

其次,执行此功能。我该怎么做,每隔100毫秒检查一次消息,或者有事件类型的东西吗?

我真的很困惑,在这里我很感激。

1 个答案:

答案 0 :(得分:3)

我担心我不完全明白你在这里问的是什么。

您找到的WndProc函数定义不是C#中的样子。相反,您将覆盖WndProc member function of the Control class。所有窗口消息都通过此功能路由。如果您想以一种不寻常的方式处理消息,那么您只能覆盖它,以执行.NET Framework尚未为您执行的操作。

例如,对于Form,您可以像这样覆盖WndProc:

public class MyForm : Form
{
    // other code

    protected override void WndProc(ref Message m)
    {
        switch (m.Msg)
        {
            case WM_NCACTIVATE:
            {
                SystemSounds.Beep.Play();
                break;  
            }
            base.WndProc(ref m);  // proceed with default processing
        }
    }
}

请注意,.NET Framework将所有消息信息包装到Message structure中,而不是像Win32 API那样将4个原始参数传递给函数。

  

我认为有一个int msg代表消息。不是wndproc应该得到它吗?把它交给wndproc有什么意义?

Message.Msg member对应于函数定义中的int msg参数。这是要处理的窗口消息的标识符。这些都是在Windows头文件中定义的,它们通常以WM_开头。您可以在MSDN上找到这些消息的文档,它们将告诉您它们的含义以及何时收到它们。例如,WM_NCACTIVATE message在其非客户区域被激活或停用时被发送到窗口。

每次收到任何邮件时,WndProc函数都将被称为 。您确定收到哪个消息的方式,以及您应该处理哪个消息的方式是通过切换Message.Msg成员的值(或者,在您的原始示例中,{{ 1}}参数)。

  

其次,执行此功能。我该怎么做,每隔100毫秒检查一次消息,或者有事件类型的东西吗?

您无需检查任何内容。 WndProc是一个函数,就像任何其他函数一样,包括你自己编写的函数,这意味着它只在它应该执行时被调用。

它本身不是一个事件,尽管WndProc函数内部的默认处理是负责提升您熟悉的事件以响应它收到的某些消息。

  

我试图在一个应用程序上做一些事情,我知道它的名字等...(所以我是alredy铸造findwindow和东西)对于前。我想在该窗口试图获得焦点时通知用户。

我不确定这意味着什么,但你应该调查WM_ACTIVATEAPP message。无论何时激活该消息以及何时停用该消息,该消息都被发送到该窗口。响应该消息,您可以选择做任何您喜欢的事情,包括播放声音。如链接文档所示,msg参数(在Message.WParam member中找到)会告诉您窗口是激活还是停用。

这非常先进。在WinForms中编程时,极少需要覆盖WndProc方法。通过这样做,你几乎可以做任何事情,但几乎总是有一种更好,更简单的做事方式。