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; } }
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); }