无法将Skype4COM的Windows服务附加到Skype客户端

时间:2013-01-25 09:17:32

标签: windows api service skype skype4com

我尝试创建一个允许与Skype客户端交互的Windows服务。

我正在使用SKYPE4COM.DLL lib。

当我创建一个简单的控制台或win32应用程序时,一切正常(我有这个应用程序的Skype请求,它运行良好)。但是当我尝试将此应用程序作为服务运行时, 我有一个错误

Service cannot be started. System.Runtime.InteropServices.COMException (0x80040201): Wait timeout.
at SKYPE4COMLib.SkypeClass.Attach(Int32 Protocol, Boolean Wait)
at Commander.Commander.OnStart(String[] args)
at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)

我没有关于连接Skype的流程的通知。

您能否告诉我如何将服务附加到Skype客户端,或者我可能需要更改我的Skype设置?

2 个答案:

答案 0 :(得分:0)

我认为由于Windows用户标识安全限制,这是不可能的。您必须在与Skype相同的用户下运行您的应用程序,否则将无法附加。

答案 1 :(得分:0)

我有同样的问题。 通过将其转换为Windows应用程序并将其用作系统托盘应用程序来解决它:

[STAThread]
static void Main()
{
    Log.Info("starting app");

    //facade that contains all code for my app
    var facade = new MyAppFacade();

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);


    using (ProcessIcon icon = new ProcessIcon(facade))
    {
        icon.Display();

        Application.Run();
    }
}

public class ProcessIcon : IDisposable
{
    private readonly MyAppFacade facade;
    private NotifyIcon ni;

    public ProcessIcon(MyAppFacade facade)
    {
        this.facade = facade;
        this.ni = new NotifyIcon();
    }

    public void Display()
    {
        ni.Icon = Resources.Resources.TrayIcon;
        ni.Text = "Skype soccer";
        ni.Visible = true;

        // Attach a context menu.
        ni.ContextMenuStrip = new ContextMenuStrip();

        var start = new ToolStripMenuItem("Start");
        start.Click += (sender, args) => facade.Start();
        ni.ContextMenuStrip.Items.Add(start);

        var stop = new ToolStripMenuItem("Stop");
        stop.Click += (sender, args) => facade.Stop();
        ni.ContextMenuStrip.Items.Add(stop);

        var exit = new ToolStripMenuItem("Exit");
        exit.Click += (sender, args) => Application.Exit();
        ni.ContextMenuStrip.Items.Add(exit);
    }

    public void Dispose()
    {
        ni.Dispose();
    }
}