public static bool PerformGlobal(List<PwDatabase> vSources, ImageList ilIcons) { Debug.Assert(vSources != null); if(vSources == null) return false; if(KeePassLib.Native.NativeLib.IsUnix()) { if(!NativeMethods.TryXDoTool(true)) { MessageService.ShowWarning(KPRes.AutoTypeXDoToolRequiredGlobalVer); return false; } } IntPtr hWnd; string strWindow; try { // hWnd = NativeMethods.GetForegroundWindowHandle(); // strWindow = NativeMethods.GetWindowText(hWnd); NativeMethods.GetForegroundWindowInfo(out hWnd, out strWindow, true); } catch(Exception) { Debug.Assert(false); hWnd = IntPtr.Zero; strWindow = null; } if(string.IsNullOrEmpty(strWindow)) return false; if(!IsValidAutoTypeWindow(hWnd, true)) return false; SequenceQueriesEventArgs evQueries = GetSequencesForWindowBegin( hWnd, strWindow); List<AutoTypeCtx> lCtxs = new List<AutoTypeCtx>(); PwDatabase pdCurrent = null; DateTime dtNow = DateTime.Now; EntryHandler eh = delegate(PwEntry pe) { // Ignore expired entries if(pe.Expires && (pe.ExpiryTime < dtNow)) return true; List<string> lSeq = GetSequencesForWindow(pe, hWnd, strWindow, pdCurrent, evQueries.EventID); foreach(string strSeq in lSeq) { lCtxs.Add(new AutoTypeCtx(strSeq, pe, pdCurrent)); } return true; }; foreach(PwDatabase pwSource in vSources) { if(pwSource.IsOpen == false) continue; pdCurrent = pwSource; pwSource.RootGroup.TraverseTree(TraversalMethod.PreOrder, null, eh); } GetSequencesForWindowEnd(evQueries); if(lCtxs.Count == 1) AutoType.PerformInternal(lCtxs[0], strWindow); else if(lCtxs.Count > 1) { AutoTypeCtxForm dlg = new AutoTypeCtxForm(); dlg.InitEx(lCtxs, ilIcons); if(dlg.ShowDialog() == DialogResult.OK) { try { NativeMethods.EnsureForegroundWindow(hWnd); } catch(Exception) { Debug.Assert(false); } if(dlg.SelectedCtx != null) AutoType.PerformInternal(dlg.SelectedCtx, strWindow); } UIUtil.DestroyForm(dlg); } return true; }
public static bool PerformGlobal(List<PwDatabase> vSources, ImageList ilIcons) { Debug.Assert(vSources != null); if(vSources == null) return false; if(KeePassLib.Native.NativeLib.IsUnix()) { if(!NativeMethods.TryXDoTool(true)) { MessageService.ShowWarning(KPRes.AutoTypeXDoToolRequiredGlobalVer); return false; } } IntPtr hWnd; string strWindow; try { // hWnd = NativeMethods.GetForegroundWindowHandle(); // strWindow = NativeMethods.GetWindowText(hWnd); NativeMethods.GetForegroundWindowInfo(out hWnd, out strWindow, true); } catch(Exception) { Debug.Assert(false); hWnd = IntPtr.Zero; strWindow = null; } // if(string.IsNullOrEmpty(strWindow)) return false; if(strWindow == null) { Debug.Assert(false); return false; } if(!IsValidAutoTypeWindow(hWnd, true)) return false; SequenceQueriesEventArgs evQueries = GetSequencesForWindowBegin( hWnd, strWindow); List<AutoTypeCtx> lCtxs = new List<AutoTypeCtx>(); PwDatabase pdCurrent = null; bool bExpCanMatch = Program.Config.Integration.AutoTypeExpiredCanMatch; DateTime dtNow = DateTime.UtcNow; EntryHandler eh = delegate(PwEntry pe) { if(!bExpCanMatch && pe.Expires && (pe.ExpiryTime <= dtNow)) return true; // Ignore expired entries List<string> lSeq = GetSequencesForWindow(pe, hWnd, strWindow, pdCurrent, evQueries.EventID); foreach(string strSeq in lSeq) { lCtxs.Add(new AutoTypeCtx(strSeq, pe, pdCurrent)); } return true; }; foreach(PwDatabase pwSource in vSources) { if(pwSource.IsOpen == false) continue; pdCurrent = pwSource; pwSource.RootGroup.TraverseTree(TraversalMethod.PreOrder, null, eh); } GetSequencesForWindowEnd(evQueries); bool bForceDlg = Program.Config.Integration.AutoTypeAlwaysShowSelDialog; if((lCtxs.Count >= 2) || bForceDlg) { AutoTypeCtxForm dlg = new AutoTypeCtxForm(); dlg.InitEx(lCtxs, ilIcons); bool bOK = (dlg.ShowDialog() == DialogResult.OK); AutoTypeCtx ctx = (bOK ? dlg.SelectedCtx : null); UIUtil.DestroyForm(dlg); if(ctx != null) { try { NativeMethods.EnsureForegroundWindow(hWnd); } catch(Exception) { Debug.Assert(false); } // Allow target window to handle its activation; // https://sourceforge.net/p/keepass/discussion/329220/thread/3681f343/ Application.DoEvents(); Thread.Sleep(TargetActivationDelay); Application.DoEvents(); AutoType.PerformInternal(ctx, strWindow); } } else if(lCtxs.Count == 1) AutoType.PerformInternal(lCtxs[0], strWindow); return true; }