单击表单的标题栏时会调用什么函数?

时间:2019-05-31 07:42:08

标签: c# forms titlebar

我有一个包含Unity流程的表格。有时会发生“某些事情”,从而使得无法对流程执行某些操作。 我发现单击标题栏可以重新启用执行我要在进程中执行的操作的可能性。

“某物”是我的功能:

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

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


        }

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

或者如果您对如何处理还有其他想法... =)

非常感谢!

2 个答案:

答案 0 :(得分:1)

    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

答案 1 :(得分:0)

您正在尝试的方法将是肮脏的,并且可能会为您的问题提供更好的解决方案。您的问题的原因在其他地方,必须通过另一种方法来处理。

但是要回答您的特定问题,当单击“ Tite”栏时会发生什么:您的程序随后收到WM_NCACTIVATE消息(https://docs.microsoft.com/en-us/windows/desktop/winmsg/wm-ncactivate)。这发生在Win32 API层(即.NET之下的层)上。如果您从未使用过win32 API,则应该首先阅读有关它的“消息泵”机制(https://docs.microsoft.com/de-de/windows/desktop/winmsg/about-messages-and-message-queues)。您可以通过PInvoke在.NET中发送win32 API消息,在那里使用同步SendMessage()函数(https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-sendmessage)或使用异步PostMessage()函数(https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-postmessagea)。对于您的解决方法,这应该是一个很好的切入点。