Ejemplo n.º 1
0
        private void Login(GetSkypeLoginWindowDataResult skypeLoginWindowData)
        {
            // Set user name
            WinApi.User32.SendMessage(skypeLoginWindowData.LoginEditPtr, WinApi.MessageType.WM_SETTEXT, IntPtr.Zero, _username);

            // Simulate Enter press to initiate login
            WinApi.User32.PostMessage(skypeLoginWindowData.LoginEditPtr, WinApi.MessageType.WM_KEYDOWN, new IntPtr((int)WinApi.VirtualKeyCode.VK_RETURN), IntPtr.Zero);

            // Force minimize Skype if it should. For some reason Skype restores itself after login begins
            if (_minimized)
            {
                TimedOutOperation(1000, 1, () => {
                    if (!WinApi.User32.IsIconic(skypeLoginWindowData.LoginWindowPtr))
                    {
                        WinApi.User32.ShowWindow(skypeLoginWindowData.LoginWindowPtr, WinApi.User32.ShowWindowCommands.SW_FORCEMINIMIZE);
                        return(true);
                    }
                    return(false);
                });
            }

            _canThrowSkypeExitException = true;
            try {
                bool success = TimedOutOperation(kHtmlGetObjectTimeout, kOperationRetryDelay, () => {
                    IntPtr internetExplorerServerHandle = GetInternetExplorerServerHandle(skypeLoginWindowData.LoginWindowPtr);
                    if (internetExplorerServerHandle == IntPtr.Zero)
                    {
                        return(false);
                    }

                    _loginBrowserHtmlDocument = GetHtmlDocumentClassFromInternetExplorerServerHandle(internetExplorerServerHandle);
                    if (_loginBrowserHtmlDocument == null)
                    {
                        return(false);
                    }

                    return(true);
                });

                if (!success)
                {
                    throw new LoginException("Unable to get the Skype login web document");
                }

                WebBrowserLogin();
            } catch (ThreadAbortException e) {
                throw new LoginException("Skype process has died unexpectedly", e);
            } finally {
                _canThrowSkypeExitException = false;
            }
        }
Ejemplo n.º 2
0
        private void ExecuteLogin()
        {
            // Wait for Skype login window to create
            Debug.WriteLine("Wait for Skype login window to create");

            GetSkypeLoginWindowDataResult skypeLoginWindowData = new GetSkypeLoginWindowDataResult(GetSkypeLoginWindowDataResult.State.Failed);
            int  skypeRestarts = 0;
            bool success       = false;

            while (skypeRestarts < kSkypeMaxRestarts)
            {
                bool isSkypeExited     = false;
                bool isAlreadyLoggedIn = false;
                success = TimedOutOperation(kWaitForSkypeLoginWindowTimeout, kOperationRetryDelay, () => {
                    if (_skypeProcess.HasExited)
                    {
                        isSkypeExited = true;

                        // Exit prematurely
                        return(true);
                    }

                    skypeLoginWindowData = GetSkypeLoginWindowData();
                    switch (skypeLoginWindowData.LoginState)
                    {
                    case GetSkypeLoginWindowDataResult.State.Success:
                        return(true);

                    case GetSkypeLoginWindowDataResult.State.Failed:
                        return(false);

                    case GetSkypeLoginWindowDataResult.State.AlreadyLoggedIn:
                        isAlreadyLoggedIn = true;
                        return(true);

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                });

                if (isAlreadyLoggedIn)
                {
                    Console.WriteLine("Already logged in");
                    return;
                }

                if (isSkypeExited)
                {
                    // Restarts Skype after some delay
                    success = false;
                    skypeRestarts++;

                    Console.WriteLine("Skype process exited unexpectedly, restarting in {0} ms", kSkypeRestartDelay);
                    Thread.Sleep(kSkypeRestartDelay);
                    StartSkypeProcess();
                }
                else
                {
                    break;
                }
            }

            if (!success)
            {
                throw new LoginException("Unable to detect Skype login window");
            }

            Login(skypeLoginWindowData);
        }