среда, 12 мая 2010 г.

Обновил ExcelExportLib до версии 1.4.0.0

Собственно, обновление здесь. Много чего интересного, в частности:

- теперь можно использовать формулы в ячейках.
- можно задавать имена ячейкам. Имена должны быть уникальны. Имена можно использовать в формулах
- можно задавать комментарии для ячеек. Причем с форматированием

Вообщем, теперь можно получить что-то вроде этого:


воскресенье, 2 мая 2010 г.

Как скрыть AlwaysOnTop-форму, если запущенно полноэкранное приложение

Допустим, у нас есть программа, которая должна показывать свою форму поверх всех окон. Стандартными средствами дотнета - это легко. Но! Если запустить, например, проигрывание фильма на весь экран, наше приложение будет отображаться поверх фильма, что, безусловно, несколько неприятно :)

Однако решить эту проблемы вполне возможно.

    public partial class Form1: Form
    {
        [DllImport("user32.dll")]
        private static extern IntPtr GetForegroundWindow();
        [DllImport("user32.dll")]
        private static extern IntPtr GetDesktopWindow();
        [DllImport("user32.dll")]
        private static extern IntPtr GetShellWindow();
        [DllImport("user32.dll", SetLastError = true)]
        private static extern int GetWindowRect(IntPtr hwnd, out RECT rc);

        private IntPtr desktopHandle; //Хэндл рабочего стола
        private IntPtr shellHandle; //Хэндл оболочки

        public Form1()
        {
            InitializeComponent();

            this.TopMost = true;

            //Получаем хэндлы окон оболочки и рабочего стола
            desktopHandle = GetDesktopWindow();
            shellHandle = GetShellWindow();
        }

        public bool isThereFullScreenWindow()
        {
            //Detect if the current app is running in full screen
            bool runningFullScreen = false;
            RECT appBounds;
            Rectangle screenBounds;
            IntPtr hWnd;

            //get the dimensions of the active window
            hWnd = GetForegroundWindow();
            if (hWnd != null && !hWnd.Equals(IntPtr.Zero))
            {
                //Check we haven't picked up the desktop or the shell
                if (!(hWnd.Equals(desktopHandle) || hWnd.Equals(shellHandle)))
                {
                    GetWindowRect(hWnd, out appBounds);
                    //determine if window is fullscreen
                    screenBounds = Screen.FromHandle(hWnd).Bounds;
                    if ((appBounds.Bottom - appBounds.Top) == screenBounds.Height && (appBounds.Right - appBounds.Left) == screenBounds.Width)
                    {
                        runningFullScreen = true;
                    }
                }
            }
            return runningFullScreen;
        }
Ну а потом уже все просто:

            if (!isThereFullScreenWindow())
               this.TopMost = true;
            else
               this.TopMost = false;

Как спрятать форму от Alt+Tab

Итак, если вдруг хочется, чтобы на форму нельзя было переключиться используя Alt+Tab, то:

1. Можно сделать форму SizableToolWindow или FixedToolWindow, тогда спрятать ее можно вот так:

    this.FormBorderStyle = FormBorderStyle.SizableToolWindow;
    this.ShowInTaskbar = false;
2. Если же нужна форма без границы и без кнопок свернуть/развернуть/закрыть, то надо делать так:

    this.FormBorderStyle = FormBorderStyle.None;
    this.ShowInTaskbar = false;

...

protected override CreateParams CreateParams
{
    get
    {
        CreateParams cp = base.CreateParams;
        // turn on WS_EX_TOOLWINDOW style bit
        cp.ExStyle |= 0x80;
        return cp;
    }
}