C# 单击按钮时显示lync窗口列表

C# 单击按钮时显示lync窗口列表,c#,winforms,visual-studio,winapi,lync-client-sdk,C#,Winforms,Visual Studio,Winapi,Lync Client Sdk,我正在尝试开发一个winform应用程序,其中有一个按钮。单击按钮时,lync窗口的列表应与我们将鼠标悬停在系统任务栏中的lync图标上时的显示相同,如下所示 如何在winform上单击按钮获得相同的功能 我正在使用Lync SDK 2013,但对2010也很满意 总之,当我们将鼠标悬停在我窗体上的按钮任务栏中的lync图标上时,我想模拟这个函数。单击按钮,将显示对话列表,突出显示当前/最近的对话,单击该列表将进入该特定对话窗口。 有什么想法吗 谢谢这有点难看,但当我试图检测对话窗口时,我别无

我正在尝试开发一个winform应用程序,其中有一个按钮。单击按钮时,lync窗口的列表应与我们将鼠标悬停在系统任务栏中的lync图标上时的显示相同,如下所示

如何在winform上单击按钮获得相同的功能

我正在使用Lync SDK 2013,但对2010也很满意

总之,当我们将鼠标悬停在我窗体上的按钮任务栏中的lync图标上时,我想模拟这个函数。单击按钮,将显示对话列表,突出显示当前/最近的对话,单击该列表将进入该特定对话窗口。 有什么想法吗


谢谢

这有点难看,但当我试图检测对话窗口时,我别无选择,只能使用windows API函数枚举所有窗口,然后检查窗口类
“LynchConversationWindowClass”
。但这是一年多前使用Lync 2010的情况——不知道它是否适用于Lync 2013,或者是否有更好的解决方案

至少,此代码不需要Lync SDK。;-)

这是我的代码片段,我希望它有帮助:

void Test()
{
    int conversationWindowCount = WindowDetector.Count("LyncConversationWindowClass");
}

static class WindowDetector
{
    private delegate bool CallBackPtr(int hwnd, int lParam);

    [DllImport("user32.dll")]
    private static extern int EnumWindows(CallBackPtr callPtr, int lPar);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount);

    private static readonly object Lock = new object();

    private static int _count;
    private static string _className;

    private static bool EnumWindowsCallback(int hwnd, int lparam)
    {
        var sb = new StringBuilder(255);
        GetClassName(new IntPtr(hwnd), sb, sb.Capacity);
        string className = sb.ToString();

        if (className == _className)
        {
            _count++;
        }

        // return true to continue enumerating or false to stop
        return true;
    }

    /// <summary>
    ///     Returns the count of windows which have the specified class name.
    /// </summary>
    /// <param name="className">The window class name to look for (case-sensitive).</param>
    public static int Count(string className)
    {
        lock (Lock)
        {
            _count = 0;
            _className = className;

            EnumWindows(EnumWindowsCallback, 0);

            return _count;
        }
    }
}
void测试()
{
int conversationWindowCount=WindowDetector.Count(“LynchConversationWindowClass”);
}
静态类窗口检测器
{
私有委托bool CallBackPtr(inthwnd,intlparam);
[DllImport(“user32.dll”)]
私有静态外部内部枚举窗口(CallBackPtr callPtr,intlpar);
[DllImport(“user32.dll”,SetLastError=true,CharSet=CharSet.Auto)]
私有静态外部int GetClassName(IntPtr hWnd、StringBuilder lpClassName、int nMaxCount);
私有静态只读对象锁=新对象();
私有静态整数计数;
私有静态字符串_className;
私有静态bool EnumWindowsCallback(int-hwnd、int-lparam)
{
var sb=新的StringBuilder(255);
GetClassName(新IntPtr(hwnd)、sb、sb容量);
字符串className=sb.ToString();
if(className==\u className)
{
_计数++;
}
//返回true以继续枚举,或返回false以停止
返回true;
}
/// 
///返回具有指定类名的窗口的计数。
/// 
///要查找的窗口类名(区分大小写)。
公共静态整数计数(字符串类名称)
{
锁(锁)
{
_计数=0;
_className=className;
EnumWindows(EnumWindowsCallback,0);
返回计数;
}
}
}

如果要查找所有Lync对话,请使用SDK中的属性。ConversationManager上还有ConversationAdded和ConversationRemoved事件,因此您可以实时更新列表。

感谢您的回复……即使我也担心我们将不得不使用Win API。