пятница, 30 июля 2010 г.

ы :)


четверг, 10 июня 2010 г.

OpenHardwareMonitor

Появилась у меня тут на днях идея прикрутить к IIS на домашней машине страничку с возможностью удаленного контроля состояния домашнего компьютера когда меня нет рядом. Чтобы, значит, узнавать о проблемах, но при этом не подключаться к нему по rdp (что не всегда возможно/удобно/быстро). Соответственно, хотелось мониторить состояние железа, процессов, общую загрузку, ну и т.п. (по ходу дела будет понятно, что там еще надо).

Как ни удивительно, но самое простое - определить температуру процессора и скорость вращения вентиляторов - это практически невыполнимая задача :(

Теоретически, необходимую информацию можно запросить через WMI, но есть одна маленькая проблема - для этого производитель материнской платы должен написать драйвер, который будет эту информацию отдавать операционной системе. Однако, большинство производителей этого не делают.

В результате - весь интернет наполнен вопросами вида: "как мне узнать температуру процессора?? я тут делаю - но оно не работает" и с единственным вариантом ответа: "напиши свой драйвер или забудь".

Однако, несмотря ни на что, я все-таки нашел решение - OpenHardwareMonitor. Написано на C#, использует собственный драйвер. Исходники доступны тут. Лицензия - Mozilla Pulic License v1.1.

среда, 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;