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; bool bExpCanMatch = Program.Config.Integration.AutoTypeExpiredCanMatch; DateTime dtNow = DateTime.Now; 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); }
internal static bool PerformGlobal(List <PwDatabase> lSources, ImageList ilIcons, string strSeq) { if (lSources == null) { Debug.Assert(false); return(false); } if (NativeLib.IsUnix()) { if (!NativeMethods.TryXDoTool(true) && !NativeLib.IsWayland()) { 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); if (!string.IsNullOrEmpty(strSeq) && (lSeq.Count != 0)) { lCtxs.Add(new AutoTypeCtx(strSeq, pe, pdCurrent)); } else { foreach (string strSeqCand in lSeq) { lCtxs.Add(new AutoTypeCtx(strSeqCand, pe, pdCurrent)); } } return(true); }; foreach (PwDatabase pd in lSources) { if ((pd == null) || !pd.IsOpen) { continue; } pdCurrent = pd; pd.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); } int nActDelayMS = TargetActivationDelay; string strWindowT = strWindow.Trim(); // https://sourceforge.net/p/keepass/discussion/329220/thread/3681f343/ // This apparently is only required here (after showing the // auto-type entry selection dialog), not when using the // context menu command in the main window if (strWindowT.EndsWith("Microsoft Edge", StrUtil.CaseIgnoreCmp)) { // 700 skips the first 1-2 characters, // 750 sometimes skips the first character nActDelayMS = 1000; } // Allow target window to handle its activation // (required by some applications, e.g. Edge) Application.DoEvents(); Thread.Sleep(nActDelayMS); Application.DoEvents(); AutoType.PerformInternal(ctx, strWindow); } } else if (lCtxs.Count == 1) { AutoType.PerformInternal(lCtxs[0], strWindow); } 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 (!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); }