-1

我试图在一个应用程序上做一些事情,我知道它的名字等等......(所以我已经在铸造 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 毫秒检查一次消息还是有事件类型的东西呢?

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

4

1 回答 1

3

恐怕我不完全明白你在这里问什么。

您发现的 WndProc 函数定义与 C# 中的不同。相反,您将覆盖类的WndProc成员函数Control。所有窗口消息都通过此函数进行路由。如果您想以不寻常的方式处理消息,您只会覆盖它,以执行 .NET Framework 尚未为您执行的操作。

例如,对于表单,您可以像这样覆盖 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结构中,而不是像 Win32 API 那样将 4 个原始参数传递给函数。

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

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

每次收到任何消息时都会调用 WndProc 函数。您确定收到条消息以及应该处理哪条消息的方法是打开Message.Msg成员的值(或者,在您的原始示例中,msg参数)。

其次,执行这个功能。我该怎么办,每 100 毫秒检查一次消息还是有事件类型的东西呢?

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

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

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

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

这几乎和它一样先进。在 WinForms 中编程时,需要重写 WndProc 方法的情况极为罕见。通过这样做,您几乎可以做任何事情,但几乎总是有更好、更简单的方法来做事。

于 2012-07-26T13:40:06.420 回答