コード例 #1
0
    void winPosChange(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
    {
        long lStyle = WinAPI.GetWindowLong(handle, GWL_STYLE);

        lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
        SetWindowLongPtr(handle, GWL_STYLE, lStyle);
        long lExStyle = WinAPI.GetWindowLong(handle, GWL_EXSTYLE);

        lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE);
        SetWindowLongPtr(handle, GWL_EXSTYLE, lExStyle);

        WinAPI.SetWindowPos(handle, HWND_BOTTOM, 0, -40, fWidth, fHeight, (int)(SetWindowPosFlags.SWP_FRAMECHANGED | SetWindowPosFlags.SWP_NOMOVE | SetWindowPosFlags.SWP_NOSIZE | SetWindowPosFlags.SWP_NOZORDER | SetWindowPosFlags.SWP_NOOWNERZORDER));
        WINDOWPOS wndPos = WINDOWPOS.FromMessage(hWnd, msg, wParam, lParam);

        wndPos.flags = wndPos.flags | SetWindowPosFlags.SWP_NOZORDER;
        wndPos.UpdateMessage(hWnd, msg, wParam, lParam);

        ShowWindow(handle, (int)ShowWindowFlags.SW_SHOWMAXIMIZED);
    }
コード例 #2
0
    static void winPosChange(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam)
    {
        if (ShowWindow(handle, (int)ShowWindowFlags.SW_SHOWMAXIMIZED))
        {
            if (borderless)
            {
                long lStyle = WinAPI.GetWindowLong(handle, GWL_STYLE);
                lStyle &= ~(WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU);
                SetWindowLongPtr(handle, GWL_STYLE, lStyle);
                long lExStyle = WinAPI.GetWindowLong(handle, GWL_EXSTYLE);
                lExStyle &= ~(WS_EX_DLGMODALFRAME | WS_EX_CLIENTEDGE | WS_EX_STATICEDGE | WS_EX_APPWINDOW);
                SetWindowLongPtr(handle, GWL_EXSTYLE, lExStyle);
            }

            if (keepBottomMost)
            {
                WINDOWPOS wndPos = WINDOWPOS.FromMessage(hWnd, msg, wParam, lParam);
                wndPos.flags = wndPos.flags | SetWindowPosFlags.SWP_NOZORDER;
                wndPos.UpdateMessage(hWnd, msg, wParam, lParam);
            }
        }
    }
コード例 #3
0
        public IntPtr WndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
        {
            switch ((WM)msg)
            {
            case WM.COPYDATA:
                if (lParam == IntPtr.Zero)
                {
                    CairoLogger.Instance.Debug("TrayService: CopyData is null");
                    break;
                }

                COPYDATASTRUCT copyData =
                    (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, typeof(COPYDATASTRUCT));

                switch ((int)copyData.dwData)
                {
                case 0:
                    // AppBar message
                    if (Marshal.SizeOf(typeof(APPBARMSGDATAV3)) == copyData.cbData)
                    {
                        APPBARMSGDATAV3 amd = (APPBARMSGDATAV3)Marshal.PtrToStructure(copyData.lpData,
                                                                                      typeof(APPBARMSGDATAV3));

                        if (Marshal.SizeOf(typeof(APPBARDATAV2)) != amd.abd.cbSize)
                        {
                            CairoLogger.Instance.Debug("TrayService: Size incorrect for APPBARMSGDATAV3");
                            break;
                        }

                        if (AppBarMessageAction(amd))
                        {
                            return((IntPtr)1);
                        }
                    }
                    else
                    {
                        CairoLogger.Instance.Debug("TrayService: AppBar message received, but with unknown size");
                    }
                    break;

                case 1:
                    SHELLTRAYDATA trayData =
                        (SHELLTRAYDATA)Marshal.PtrToStructure(copyData.lpData,
                                                              typeof(SHELLTRAYDATA));
                    if (trayDelegate != null)
                    {
                        if (trayDelegate(trayData.dwMessage, new SafeNotifyIconData(trayData.nid)))
                        {
                            return((IntPtr)1);
                        }

                        CairoLogger.Instance.Debug("TrayService: Ignored notify icon message");
                    }
                    else
                    {
                        CairoLogger.Instance.Info("TrayService: TrayDelegate is null");
                    }
                    break;

                case 3:
                    WINNOTIFYICONIDENTIFIER iconData =
                        (WINNOTIFYICONIDENTIFIER)Marshal.PtrToStructure(copyData.lpData,
                                                                        typeof(WINNOTIFYICONIDENTIFIER));

                    if (iconDataDelegate != null)
                    {
                        return(iconDataDelegate(iconData.dwMessage, iconData.hWnd, iconData.uID,
                                                iconData.guidItem));
                    }

                    CairoLogger.Instance.Info("TrayService: IconDataDelegate is null");
                    break;
                }

                break;

            case WM.WINDOWPOSCHANGED:
                WINDOWPOS wndPos = WINDOWPOS.FromMessage(lParam);

                if ((wndPos.flags & SetWindowPosFlags.SWP_SHOWWINDOW) != 0)
                {
                    SetWindowLong(HwndTray, GWL_STYLE,
                                  GetWindowLong(HwndTray, GWL_STYLE) &
                                  ~(int)WindowStyles.WS_VISIBLE);

                    CairoLogger.Instance.Debug($"TrayService: {TrayWndClass} became visible; hiding");
                }
                break;
            }

            if (msg == (int)WM.COPYDATA || msg == (int)WM.ACTIVATEAPP)
            {
                return(ForwardMsg(msg, wParam, lParam));
            }

            return(DefWindowProc(hWnd, msg, wParam, lParam));
        }