// Временно ограничим перемещения курсора областью формы Form1
[DllImport("user32.dll")]
static extern bool ClipCursor(ref RECT lpRect);
[DllImport("user32.dll")]
public static extern int GetWindowRect(IntPtr hwnd, ref RECT lpRect);
[DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
public static extern IntPtr GetDesktopWindow();
[StructLayout(LayoutKind.Sequential)]
public struct RECT
{
public int left;
public int top;
public int right;
public int bottom;
}
private void button1_Click(object sender, EventArgs e)
{
RECT rc = new RECT(); // прямоугольник ограничения
GetWindowRect(this.Handle, ref rc); // помещаем координаты окна в прямоугольник
ClipCursor(ref rc); // ограничиваем перемещения курсора
}
private void button2_Click(object sender, EventArgs e)
{
//код для "освобождения" курсора.
RECT rc = new RECT(); // прямоугольник ограничения
IntPtr hWind = GetDesktopWindow(); // получаем описатель рабочего стола
GetWindowRect(hWind, ref rc); // помещаем координаты рабочего стола в прямоугольник
ClipCursor(ref rc); // "ограничиваем" курсор целым экраном
}
воскресенье, 3 апреля 2011 г.
ClipCursor
четверг, 22 октября 2009 г.
WM_APPCOMMAND
Недавно в справочник по функциям Windows API я добавил новый материал - описание сообщения WM_APPCOMMAND. Предлагаю вашему вниманию рассказ об этом интересном сообщении в сжатом виде. Само сообщение объявляется следующим образом:
private const int WM_APPCOMMAND = 0x319;
Сообщение WM_APPCOMMAND уведомляет окно о том, что пользователь создал командное событие прикладной программы, например, щелкнул на кнопке в приложении, используя мышь, или нажал на клавиатуре клавишу управления приложением.
С помощью данного сообщения можно, например, отключить системный микшер, значок которого находится в области уведомлений рядом с часиками.
private const int APPCOMMAND_VOLUME_MUTE = 0x8 * 0x10000;
private void button2_Click(object sender, EventArgs e)
{
// выключаем/включаем микшер
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_VOLUME_MUTE);
}
Обратите внимание, что микшер включается или выключаетя циклически, т.е. для включения микшера нужно еще раз послать данное сообщение.
Также можно увеличивать или уменьшать уровень громкости микшера(константы APPCOMMAND_VOLUME_DOWN и APPCOMMAND_VOLUME_UP). Кроме того, среди используемых констант можно найти управление микрофоном, браузером или универсальным проигрывателем. Вот как можно поставить на паузу Windows Media Player из своей программы:
private const int APPCOMMAND_MEDIA_PLAY_PAUSE = 0x14 * 0x10000;
SendMessageW(this.Handle, WM_APPCOMMAND, this.Handle, (IntPtr)APPCOMMAND_MEDIA_PLAY_PAUSE);
Полный список доступных констант вы найдете в справочнике. Хочу обратить ваше внимание, что все значения констант в сообщении WM_APPCOMMAND необходимо умножить на 0x10000, что я и сделал в предыдущих примерах. Используются ли данные константы без умножения в других сообщениях , я не знаю. Кто в курсе - отзовитесь.
Кстати, при изучении документации MSDN, я обнаружил еще одну интересную константу APPCOMMAND_DWM_FLIP3D, который включает режим FLIP 3D в Windows 7 (Кстати, сегодня первый день розничной продажи Windows 7).
Удачного вам программирования!
суббота, 23 мая 2009 г.
Windows Vista Bridge Sample Library
Поэтому я решил написать свой вариант статьи на эту тему. Чтобы не начинать работу с нуля, я взял за основу уже имеющиеся статьи и немного поправил их. Предварительный вариант статьи можно прочитать по адресу http://developer.alexanderklimov.ru/articles/vbsl.php. В дальнейшем я переработаю статью и постараюсь сделать ее более понятной. Если у вас есть вопросы по данной библиотеке, то можете обратиться ко мне. Самый лучший способ поделиться своим вопросом - это воспользоваться специальной формой Оставь свой отзыв, которую можно найти в правой части главной страницы http://developer.alexanderklimov.ru. Также можете задать свой вопрос по электронной почте или в комментариях к этому посту.
Удачного вам программирования!
воскресенье, 5 апреля 2009 г.
Колокольчик для коровы
Некоторое время назад я начал переводить статью для раздела Windows Mobile, взятую с Codin4Fun. А недавно обнаружил, что эту статью также перевели на русском варианте Coding4Fun. Честно говоря, мне не очень понравился тот перевод, поэтому я все-таки решил выложить на своем сайте свой вариант перевода. Прочитать статью можно здесь.
Удачного вам программирования!
воскресенье, 22 марта 2009 г.
ShellAbout
Сегодня познакомлю вас с простой функцией Windows API ShellAbout.
[DllImport("shell32.dll")]
static extern int ShellAbout(IntPtr hWnd, string szApp, string szOtherStuff, IntPtr hIcon);
ShellAbout выводит стандартное диалоговое окно Windows "О программе". Такое окно, например, вы можете увидеть при выборе меню О программе в Блокноте (notepad.exe). ЭТо окно можно использовать, когда у вас нет времени на разработку своего окна About.
Параметры
- hwnd
- Описатель родительского окна, вызывающего функцию
- szApp
- Выводит текст в заголовке диалогового окна и в первой строчке после слова "Microsoft". Если текст содержит разделитель (#), разделяющий текст на две части, то функция выводит первую часть в заголовке, а вторую после слова "Microsoft"
- szOtherStuff
- Выводит текст после информации о версии и копирайте
- hIcon
- Значок, выводимый в диалоговом окне. Если параметр равен NULL, функция показывает значок Microsoft Windows
Пример
ShellAbout(this.Handle, "Блокнотик", "Супер-программа Александра Климова", IntPtr.Zero);
Данная функция включена в справочник по функциям Windows API.
воскресенье, 7 декабря 2008 г.
Улучшенные элементы управления Windows Vista
Продолжаем изучать новые возможности Windows Vista. Открываем статью из MSDN Magazine за август 2007 года и внимательно ее читаем. Хотя статья написана для программистов C++, нас это не должно останавливать. Я позволю себе скопировать оттуда часть интересующей нас информации. Итак...
Элементы управления редактирования и поля списка
Windows XP представил возможность показывать текстовую подсказку для элементов управления редактированием при помощи сообщения EM_SETCUEBANNER. Эта подсказка показывает пользователю информацию, которая исчезает при выделении элемента управления. Windows Vista добавил к этому весьма ценное свойство, позволяющее показывать текст подсказки даже тогда, когда элемент управления выделен. Это на первый взгляд незначительное улучшение во многих случаях снимает необходимость статических элементов управления. Просто используйте ранее незадействованный WPARAM и установите для него значение «истина», чтобы воспользоваться этим свойством.
Примерно таким же образом Windows Vista придает это свойство и полям списка при помощи сообщения CB_SETCUEBANNER. Не существует, однако, варианта показа текста подсказки, когда элемент управления выделен, и только поля раскрывающегося списка продолжают показывать текст подсказки до тех пор, пока не сделан выбор.
Теперь чуть подробнее о том, что тут написано. Возьмем, к примеру браузер Internet Explorer. В верхнем правом углу мы видим строку поиска (текстовое поле), в котором находится слово-подсказка Google. Как только мы установим фокус на нем, то поле очистится и мы можем вводить запрос. Насколько я помню, в Firefox также реализована эта функция (под рукой нет этого браузера). Так вот, это легко реализуется при помощи соответствующего сообщения Windows.
Аналогично и для комбинированного окна ComboBox. Надо заметить, что в Windows XP, если ComboBox получает фокус, то подсказка исчезает (не могу проверить, т.к. у меня Виста).
В чем преимущество данных подсказок? У вас появляется возможность сэкономить место на форме, не прибегая к Label, так как подсказки позволяют разместить информацию для пользователя.
Я набросал небольшой пример для демонстрации, можете взглянуть на картинку ниже.

По традиции, код и описание новых сообщений Windows будут доступны зарегистрированным пользователям справочника по функциям Windows API. Остальным придется самостоятельно написать программу. Информацию я вам предоставил.
Счастливого вам программирования!
понедельник, 1 декабря 2008 г.
PrintScreen, Codin4Fun и справочник по Visual Studio
Наступило 1 декабря, а на улицах Москвы нет снега. Перейдем к новостям. Сегодня перечитывал журнал MSDN Magazine за ноябрь 2005 года и наткнулся на статью, как отключить клавишу PrintScreen, чтобы пользователь не мог скопировать снимок экрана в буфер. Автор статьи рассказывает о том, что в принципе, помешать чужой программе получить снимок экрана невозможно. Но, тем не менее, если вам все-таки нужно отключить клавишу PrintScreen, то воспользуйтесь функцией Windows API RegisterHotKey с константами IDHOT_SNAPDESKTOP и IDHOT_SNAPWINDOW. Далее в статье приводится пример на C++. Так как в моем справочнике по функциям Windows API уже было описание этой функции, то я решил написать тестовое приложение, чтобы проверить, как это все работает. Результат своих опытов я помещу в справочник в виде отдельной статьи, которая будет доступна зарегистрированным пользователям через несколько месяцев. Остальных приглашаю попробовать самостоятельно написать аналогичную программу.
Также в разделе справочники появился еще один справочник по Visual Studio. В последнее время пополнение справочника идет за счет советов Сары Форд, которые доступны с русскоязычного блога. А сегодня появилась еще одна хорошая новость - был запущен русский Codin4Fun по адресу http://blogs.msdn.com/rucoding4fun. К сожалению, на сайте появятся переводы постов, начиная с февраля 2008 года. Более ранние статьи (а среди них есть очень интересные) останутся без перевода. Если у вас есть желание перевести какие-нибудь старые статьи, то присылайте мне по адресу rusproject@mail.ru. В разделе Статьи я уже опубликовал несколько материалов оттуда.
Присоединяйтесь!
Всем удачного программирования!
понедельник, 24 ноября 2008 г.
CoCreateGuid, "Русалка" и блондинка
Кстати, если вы программируете для мобильных устройств, то обратите внимание, что вышли новые версии эмуляторов под Windows Mobile 6.1. (ссылки ищите здесь).
Переходим к Русалке. Недавно я рассказывал о песне в исполнении певицы Массква про телефон за тысячу евро. Недавно по 1 каналу показали этот фильм. Я не мог пропустить это событие и посмотрел картину. Мне фильм понравился, и песня нормально слушается. А как вам?
И, напоследок, расскажу о встрече с блондинкой. Шел я недавно в центре Москвы по Кривоколенному переулку. Навстречу мне идет молодая блондика и обращается за помощью. Ей нужен был дом 9, а мы стояли как раз между домами 8 и 10. Она мне и говорит: "Вы случайно не местный? Не подскажете, где дом 9, вот дом 8, а за ним сразу дом 10". Я немного растерялся, на миг потерял дар речи. Потом все-таки собрался, показал рукой на другую сторону переулка и сказал, что нечетные номера домов находятся на другой стороне. Она так удивилась...
Удачи вам, блондинки!
воскресенье, 2 ноября 2008 г.
Защита файлов
В Windows Vista есть защищенные файлы, которые нельзя изменять или удалять. Поэтому, если ваша программа занимается чем-то подобным, то проверьте сначала, не является ли используемый файл защищенным. Для этой цели и служит функция SfcIsFileProtected, которая возвращает true, если файл защищен, и false, если файл не защищен. Проверяем.
// Проверим, является ли Блокнот и утилита от NERO в папке Windows защищенными файлами
MessageBox.Show(SfcIsFileProtected(IntPtr.Zero,@"c:\windows\notepad.exe").ToString());
MessageBox.Show(SfcIsFileProtected(IntPtr.Zero,@"c:\windows\unnerovision.exe").ToString());
Полное описание функции, как всегда, будет доступно зарегистрированным пользователям справочника по функциям Windows API.
Счастливого вам программирования!
вторник, 28 октября 2008 г.
Функция StrFormatByteSize
Вот как выглядит объявление функции на C#
[DllImport("Shlwapi.dll", CharSet = CharSet.Auto)]public static extern long StrFormatByteSize( long dw,[MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszBuf, int cchBuf );
Создаем для нее обертку и выводим результат
public static string FormatByteSize(long fileSize)
{
StringBuilder sbBuffer = new StringBuilder(20);
StrFormatByteSize(fileSize, sbBuffer, 20);
return sbBuffer.ToString();
}
// Выбираем максимальное возможное значение
MessageBox.Show(FormatByteSize(long.MaxValue));
Описание параметров и примеры на Visual Basiс будут доступны в моем справочнике по фунциями Windows API.
Счастливого вам программирования!
воскресенье, 5 октября 2008 г.
Устаревшая функция MessageBeep
Счастливого вам программирования!
воскресенье, 10 августа 2008 г.
Функции для Aero Glass
[DllImport("dwmapi.dll", PreserveSig = false)]public static extern bool DwmIsCompositionEnabled();
[DllImport("dwmapi.dll", PreserveSig = false)]public static extern void DwmEnableComposition(bool bEnable);
Теперь можно использовать их следующим образом:
// Если компновка рабочего стола доступна (включен Aero Glass)
if (DwmIsCompositionEnabled())
{
MessageBox.Show("Aero Glass включен");
}
else
{
MessageBox.Show("Aero Glass выключен");
}
// Отключаем компоновку рабочего стола (отключаем Aero Glass)
DwmEnableComposition(false);
Описания функций добавлены в Справочник по функциям Windows API для .NET Framework и будут доступны зарегистрированным пользователям в течение ближайших месяцев.
Удачного вам программирования!
вторник, 1 июля 2008 г.
Картинки для TreeView
Но, начиная с .NET Framework 2.0 у элемента TreeView есть свойства ImageIndex и SelectedImageIndex, которые в сочетании с элементом ImageList, помогут вам обеспечить необходимую функциональность. Пересмотрите свои старые примеры и внесите необходимые изменения.
Удачного вам программирования!
воскресенье, 29 июня 2008 г.
Солянка
Выбираем язык программирования, вбиваем запрос и вперед. Понятно, что поиск идет среди англоязычных книг. Возьмите на заметку.
Вторая тема - .NET Compact Framework. Очень интересное предложение сделал в своем блоге программист Крис Крафт. Он обещал в течение месяца написать 30 полезных программ, по одной программе в день. И свое обещание сдержал. На данный момент уже выложено 27 программ. Все программы поставляются в двух вариантах - готовые приложения и исходные коды. Найти это чудо можно по адресу http://www.cjcraft.com/blog/default,month,2008-06.aspx.
Меня поразила схожесть наших интересов. Одна треть этих программ уже имелась в моем арсенале. Вторую треть программ я только собирался написать. Теперь сэкономлю время и изучу готовые примеры. А остальная часть программ - это приложения, которые я хотел бы написать, но не представлял, с чего начинать. Эти примеры меня восхитили больше всего. С удовольствием изучу их, найти бы только время на изучение.
Третья тема - изучение IDE. Недавно стал нажимать на все кнопочки и менюшки в Visual Studio и обнаружил в ней новое окно Document Outline. Честно признаюсь, не знаю, когда это окно появилось в Visual Studio, может оно всегда там было? Окно это можно вызвать через View Other Windows или через Ctrl+Alt+T.
В этом окне как на ладони видны все элементы управления проекта. Их можно перемещать, удалять и добавлять из панели инструментов. Я пока не оценил практическую ценность окна, так как использовал простые проекты для исследования. Но, что-то мне подсказывает, что это полезная вещь в хозяйстве.
Четвертая тема - функции Windows API. Недавно я закончил писать пример выключения компьютера при помощи функции ExitWindowsEx. Чтобы использовать эту функцию в Windows XP/Vista, необходимо также вызывать функции GetCurrentProcess, OpenProcessToken, LookupPrivilegeValue, AdjustTokenPrivileges. Я не стану приводить этот пример здесь. Он будет доступен пользователям, которые приобрели мой справочник по фунциям Windows API. Остальные могут поискать ответ самостоятельно в интернете. Следующими функциями для изучения станут функции Windows Vista, связанные с Aero Glass. Немного об этих функциях было сказано в апрельском номере журнал MSDN Magazine за 2007 год. Надо это дело разобрать по косточкам и поместить в справочник.
Есть еще несколько интересных тем для разговора. Но, я, пожалуй, оставлю их до следующего раза.
Удачного вам программирования!
суббота, 7 июня 2008 г.
Админ ли ты?
[DllImport("shell32.dll")]
private static extern bool IsUserAnAdmin();
// Является ли пользователь администратором
Console.WriteLine("Вы админ?: {0}", IsUserAnAdmin().ToString());
Если запустите эту программу, то можете убедиться, что вы не являетесь администратором (False). Теперь найдите исполняемый файл проекта в Проводнике, щелкните правой кнопкой для вызова контекстного меню и выберите команду Запуск от имени администратора. Теперь программа будет выводить значение True. Вы повысили себе права до уровня администратора ручным способом.
Существует и другой аспект. Предположим, вы сами хотите реализовать возможность повышения уровня привилегий в своей программе. В таком случае воспользуйтесь следующим кодом:
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo(@"cmd.exe");
psi.UseShellExecute = true;
psi.Verb = "runas";
p.StartInfo = psi;
p.Start();
В приведенном примере показано, как можно запускать новый процесс с повышенными привилегиями.
Итак, после прочтения очередных страниц книги, мы познакомились с новой функцией Windows API IsUserAnAdmin, которую я сразу же поместил в свой справочник по функциям Windows API и узнали, как программно повышать права при вызове нового процесса.
Удачного вам программирования!
P.S. Чемпионат Европы по футболу стартовал. Удачного вам боления!
пятница, 9 мая 2008 г.
Узнать редакцию Vista
Но нас интересует пример на C#. Для этой цели нам подойдет новая функция Windows API GetProductInfo, которая появилась в Windows Vista. Описание этой функции я поместил в справочник по функциям Windows API для .NET Framework, а здесь приведу небольшой пример использования в функции в проекте на C#:
[DllImport("kernel32.dll")]
public static extern bool GetProductInfo(
int dwOSMajorVersion,
int dwOSMinorVersion,
int dwSpMajorVersion,
int dwSpMinorVersion,
out uint pdwReturnedProductType);
// констанды для pdwReturnedProductType
public const uint PRODUCT_BUSINESS = 0x00000006; // Business
public const uint PRODUCT_ENTERPRISE = 0x00000004; // Enterprise
public const uint PRODUCT_HOME_BASIC = 0x00000002; // Home Basic
public const uint PRODUCT_HOME_PREMIUM = 0x00000003; // Home Premium
public const uint PRODUCT_ULTIMATE = 0x00000001; // Ultimate
public const uint PRODUCT_UNDEFINED = 0x00000000;
int majorVersion = Environment.OSVersion.Version.Major;
int minorVersion = Environment.OSVersion.Version.Minor;
int spMajorVersion = Environment.OSVersion.Version.MajorRevision;
int spMinorVersion = Environment.OSVersion.Version.MinorRevision;
// Vista GerProductInfo
uint edition = PRODUCT_UNDEFINED;
if (GetProductInfo(
majorVersion,
minorVersion,
spMajorVersion,
spMinorVersion,
out edition))
{
switch (edition)
{
case PRODUCT_ENTERPRISE:
textBox1.Text += " Enterprise";
break;
case PRODUCT_ULTIMATE:
textBox1.Text += " Ultimate";
break;
case PRODUCT_BUSINESS:
textBox1.Text += " Business";
break;
case PRODUCT_HOME_PREMIUM:
textBox1.Text += " Home Preminum";
break;
case PRODUCT_HOME_BASIC:
textBox1.Text += " Home Basic";
break;
default:
textBox1.Text += " Unknown";
break;
}
}
Программисты, которые по-прежнему работают на Visual Basic 6.0, также не будут забыты. Я постараюсь включить эту фунцию в справочник по функциям Windows API для Visual Basic 6.0.
Всех с праздником Победы!
И счастливого вам программирования!
воскресенье, 2 марта 2008 г.
Declare Function SetPowerRequirement Lib "coredll.dll" (ByVal pvDevice As String, _ ByVal DeviceState As PowerState, _ ByVal DeviceFlags As Integer, _ ByVal pvSystemState As IntPtr, _ ByVal StateFlags As Integer) As IntPtr
Чтобы экран не выключался, нужно сделать так:
' Отключаем автоматическое выключение экрана
Public Sub Activate()
'request full power handle = SetPowerRequirement("BKL1:", CEDEVICE_POWER_STATE.D0, 1, IntPtr.Zero, 0)
End Sub
Более полное описание функций и примеры на C# и Visual Basic можно найти в справочнике по функциям Windows API.
Кстати, новость для тех, кто интересуется программированием для мобильных устройств. Microsoft поменяла главную страницу Windows Mobile Developer Center. Теперь на этой странице в более удобном виде собраны ресурсы для разработчика под платформу Windows Mobile. Рекомендую всем. (А вечером многие страницы Microsoft были недоступны. Надеюсь, это временное явление).
суббота, 23 февраля 2008 г.
DriveInfo di = new DriveInfo("d");
// Устанавливаем новую метку для диска D:
di.VolumeLabel = "DriveD";
// Получим метку тома
Console.WriteLine(new DriveInfo("d").VolumeLabel);
вторник, 8 января 2008 г.
Устаревшие функции Windows API (продолжение)
Старые функции в топку! Теперь аналогичный пример с использованием управляемого кода займет полстраницы вместо десяти страниц (почувствуйте разницу).
Удачного вам программирования!
четверг, 3 января 2008 г.
Устаревшие функции Windows API
Если вас интересуют описания устаревших функций Windows API, то можете посетить специальную страничку на моем сайте (http://netsources.narod.ru/oldapi/winapi.html).
Удачного вам программирования!