bystraya-otrisovka-fona-v-winforms

Недавно я, как и обещал нескольими постами ранее, взялся за написание программы EasyTask. Надо сказать, что этой мой первый опыт создания большой программы на C#, поэтому некоторые вещи мне кажутся довольно необычными, а некоторые — вообще непонятными. Взять, например, GDI+ с его, казалось бы, удобными обёртками для выполнения графических операций. Они действительно удобные, ничего не скажешь, проблемы возникают в ситуациях, когда нужно нарисовать довольно много и довольно быстро :) . Взять, например, фон для главного окна:


Фон

Фон

Читать пост до конца »

Yarrrrrrr!Yarrrrrrr! emoticon
elevaciya-i-avtozapusk-v-windows-7

Недавно заметил одну весьма неприятную особенность Windows 7: если программа тербует повышенных прав для запуска, её нельзя автоматически запускать при старте Windows. Причём, неважно каким образом установлено «требование» повышенных прав: через манифест, или в свойствах файла на закладке «Совместимасть». Учитывая тот факт, что для нормального функционирования моего проекта «Oculus» его управляющая программа должна быть запущена с правами администратора, такое положение дел меня совершенно не устраивало. Сегодня я реализовал небольшой «обходной манёвр», быть может, не очень элегантный, но работающий.

Суть метода заключается в том, что сначала программа запускается с обычными, «урезанными» правами. При запуске она проверяет наличие определённого аргумента, и, в случае его отсутствия, запускает сама себя с повышенными правами и с тем самым аргументом. В коде это выглядит примерно так:

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow)
{
	SHELLEXECUTEINFO TempInfo = {0};
...
 	if (!Service.has_arg(_T("/admin")))
 	{

 		TempInfo.cbSize = sizeof(SHELLEXECUTEINFO);
 		TempInfo.fMask = 0;
 		TempInfo.hwnd = NULL;
 		TempInfo.lpVerb = _T("runas");
 		TempInfo.lpFile = Service.AppPath();
 		TempInfo.lpParameters = _T("/admin");
 		TempInfo.lpDirectory = Service.AppFolder();
 		TempInfo.nShow = SW_NORMAL;
 		ShellExecuteEx(&TempInfo);
 		return 0;
 	}
...
}

Здесь используется функция ShellExecuteEx с недокументированным параметром «runas», который и позволяет запустить программу с повышенными правами. Service — это мой «мини-фреймворк», содержащий несколько простых полезных функций.

В результате, Windows думает, что запускает программу с урезанными правами, в то время как она коварно перезапускается с правами администратора :) .

На каждую хитрую жопу...На каждую хитрую жопу... emoticon
signals-and-slots

Решил написать простенькую реализацию паттерна «Signals and Slots«. Получилось действительно очень просто: количество параметров в сигналах ограничено одной штукой, void тоже не поддерживается. Тем не менее, вся реализация занимет всего 120 строк в одном заголовочном файле, и, что самое главное, полностью удовлетворяет моим требованиям :)

sigslot.zip (5 Кб) – может кому пригодится :)

Нормальненько :)Нормальненько :) emoticon