C# Wnd程序相关问题

C# Wnd程序相关问题,c#,winforms,wndproc,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

这是我的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应用程序的链接,即下载skypecalltest并运行它

在运行我的应用程序之前,只需登录skype,然后运行我的应用程序,在其中输入电话号码并单击“呼叫”按钮,即可看到控件不会重复出现在第二个if块中

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

在同一个链接中,还有另一种基于wpf的应用程序。这在
wndproc
反复调用的情况下工作。如果可能的话,也检查代码,并指导我遗漏了什么或犯了什么错误。谢谢
谢谢

您在什么操作系统上运行此操作


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

如果您转到我在问题中提供的链接,则可以看到SkypeRecording.zip文件。只需下载并查看代码,那里没有使用ChangeWindowMessageFilter功能,但应用程序运行良好。我开发了一个类似类型的应用程序,就是win apps,但它不起作用。不太可能,如果有必要的话,他不会得到第一个。UIPI没有“一次工作”模式。@Hans Passant:你想说什么还不清楚。你想说“如果有必要,他不会得到第一个”是什么意思?你正在调用
base.WndProc(refm)handled
false
@Ashigore:对不起,这是打字错误。如果任何人从我指定的链接下载两个zip文件,都很容易发现问题。win应用程序是由我开发的,我的灵感来自wpf应用程序。两者都可以从该链接下载。谢谢我对你以前的回答做了一些改变。。。可能是因为
m.Result
总是返回零,所以我纠正了这个问题。