Ejemplo n.º 1
0
        public static void PopupHotkeyHandler()
        {
            // Prevent duplicates
            var popups = GetOpenPopups();

            if (popups != null && popups.Any(p => p is PopupControl))
            {
                return;
            }

            var info = new WinApiProvider.GUITHREADINFO();

            info.cbSize = Marshal.SizeOf(info);
            if (WinApiProvider.GetGUIThreadInfo(0, ref info))
            {
                var hwndFocus = info.hwndFocus;
                var caretRect = GetAccessibleCaretRect(hwndFocus);

                var popup = (Application.Current as App).Host.Services.GetService(typeof(PopupControl)) as PopupControl;

                // Obtain popup handle for placement
                //var popupRect = new WinApiProvider.RECT();
                //WinApiProvider.GetWindowRect(popupHandle, ref popupRect);
                if (!RectValid(caretRect))
                {
                    // Can't accquire caret placement
                    caretRect = GetWinApiCaretRect(hwndFocus);
                    if (!RectValid(caretRect))
                    {
                        caretRect = new WinApiProvider.RECT()
                        {
                            left   = (int)(SystemParameters.PrimaryScreenWidth - popup.Width),
                            top    = (int)(SystemParameters.PrimaryScreenHeight - popup.Height),
                            right  = (int)SystemParameters.PrimaryScreenWidth,
                            bottom = (int)SystemParameters.PrimaryScreenHeight
                        };
                    }
                }

                // https://stackoverflow.com/questions/1918877/how-can-i-get-the-dpi-in-wpf
                // VisualTreeHelper.GetDpi(Visual visual)
                var dpiAtPoint = DpiUtilities.GetDpiForNearestMonitor(caretRect.right, caretRect.bottom);
                popup.HorizontalOffset = caretRect.right * DpiUtilities.DefaultDpiX / dpiAtPoint;
                popup.VerticalOffset   = caretRect.bottom * DpiUtilities.DefaultDpiY / dpiAtPoint;
                popup.IsOpen           = true;

                // OK caret placement
                //WinApiProvider.SetWindowPos(
                //    popup.Handle,
                //    IntPtr.Zero,
                //    caretRect.right,
                //    caretRect.bottom,
                //    (int)popup.Width,
                //    (int)popup.Height,
                //    WinApiProvider.SWP_NOZORDER);
            }
        }
Ejemplo n.º 2
0
 private static bool RectValid(WinApiProvider.RECT rect)
 {
     return(rect.left != 0 && rect.top != 0 && rect.right != 0 && rect.bottom != 0);
 }