Wnd Proc相关问题

时间:2014-04-23 13:40:01

标签: c# winforms wndproc

这是我的WndProc。我期待当我从我的应用程序通过Skype拨打电话时,控件应该反复进入if块,但我看到它只会出现一次。

if (m.Msg == NativeCalls.WM_COPYDATA && m.WParam == NativeCalls.HWND_BROADCAST)

我在哪里弄错了?谁能指导我?

protected override void WndProc(ref Message m)
{
    Boolean handled = false;
    if (m.Msg == NativeCalls.APIAttach && (uint) m.LParam == NativeCalls.SKYPECONTROLAPI_ATTACH_SUCCESS)
    {
        // Get the current handle to the Skype window
        NativeCalls.HWND_BROADCAST = m.WParam;
        handled = true;
        m.Result = new IntPtr(1);
    }

    // Skype sends our program messages using WM_COPYDATA. the data is in lParam
    if (m.Msg == NativeCalls.WM_COPYDATA && m.WParam == NativeCalls.HWND_BROADCAST)
    {
        COPYDATASTRUCT data = (COPYDATASTRUCT)Marshal.PtrToStructure(m.LParam, typeof(COPYDATASTRUCT));
        StatusTextBox.Items.Add(data.lpData + Environment.NewLine);

        // Check for connection
        //if (data.lpData.IndexOf("CONNSTATUS ONLINE") > -1)
        // ConnectButton.IsEnabled = false;

        // Check for calls
        IsCallInProgress(data.lpData);
        handled = true;
        m.Result = new IntPtr(1);
    }

    m.Result = IntPtr.Zero;
    if (handled) DefWndProc(ref m); else base.WndProc(ref m);
    //base.WndProc(ref m);
}

这里我附上了我的win应用程序的链接,即https://onedrive.live.com/#cid=C4A6F16F34D7540A&id=C4A6F16F34D7540A!126只需下载skypecalltest并运行它。

在运行我的应用程序之前,只需登录skype,然后运行我的应用程序,在那里你没有拨打电话,然后点击通话按钮,然后你可以看到控件不会重复到第二个if块。

所以我需要在我的代码中更改作为结果控件将在第二个if块。

在同一个链接中还有另一种基于wpf的应用程序。这是wndproc重复调用的地方。如果可能的话也检查一下代码,并指导我错过或错误。谢谢 感谢

1 个答案:

答案 0 :(得分:0)

你在运行什么O / S?

如果是Windows 7或更高版本,您的应用程序可能需要通过调用ChangeWindowMessageFilter或ChangeWindowMessageFilterEx明确选择接收WM_COPYDATA消息。