单击窗体的标题栏时会调用哪些函数?

what functions are called when clicking on the titlebar of a form?

我有一个包含 Unity 进程的表单。有时 "something" 会发生,导致无法对进程执行某些操作。 我发现点击标题栏 re-enables 可以在我的进程中执行我想要的操作。

"something" 是我的职能:

private void button1_Click(object sender, EventArgs e)
        {
            myNCServer.SendMessage();
            myNCServer.SendMyObject();

            position = myNCServer.GetPosition();
            compteur++;
            unityHWNDLabel.Text = "position = " + position + " (Updated " + compteur + " times)";


        }

所以我想知道到底发生了什么,这样我就可以 re-enable 我的过程而无需单击标题栏

或者如果您对如何处理此问题有任何其他想法... =)

非常感谢!

你正在尝试的是一个肮脏的解决方法,可能有更好的解决方案来解决你的问题,resp。您的问题的原因在于其他地方,必须通过另一种方法来处理。

但是要回答您的具体问题,单击标题栏时会发生什么:您的程序然后会收到一条 WM_NCACTIVATE 消息 (https://docs.microsoft.com/en-us/windows/desktop/winmsg/wm-ncactivate). This happens on the win32 API layer which is the layer underneath .NET. If you've never been working with win32 API you should first read about it's "message pump" mechanism (https://docs.microsoft.com/de-de/windows/desktop/winmsg/about-messages-and-message-queues). You can send win32 API messages in .NET via PInvoke, there using the synchronous SendMessage() function (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage) or using the asynchrounous PostMessage() function (https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-postmessagea)。这应该是您解决方法的一个很好的切入点。

    private const int WM_ACTIVATE = 0x0006;
    private readonly IntPtr WA_ACTIVE = new IntPtr(1);

    private void button1_Click(object sender, EventArgs e)
    {
        things();

        SendMessage(unityHWND, WM_ACTIVATE, WA_ACTIVE, IntPtr.Zero);
    }

成功了

谢谢@Kr15