Привет, кул хацкер! Что, не можешь троян
врагу впарить? Да ты посмотри на интерфейс
проги — обычное [квадратное] окно,
сворачивается уродливым квадратиком на
TaskBar… Одним словом — есть над чем поработать.
Пример — морда того же MP3-проигрывателя Sonique
или окно Norton Crash Guard в форме полицейского
значка. Вот и попробуем сбацать интерфейс в
стиле [X]: 

1) с окном произвольной формы (в данном
примере — логотип [X]) 

2) под w2k окно может быть прозрачным (если
менять прозрачность по таймеру, можно
добиться красивого эффекта плавного
мерцания) 

3) с созданием значка с контекстным меню в
SystemTray (прямо рядом с часиками 🙂

4) с перетаскиванием окна за любую его
точку (а не только за заголовок)

Несколько слов о прозрачном окне:
работает только под w2k, а всё потому, что в
winAPI добавилась функция SetLayeredWindowAttributes. А в
старом мастдае её нет 🙁 Конечно, можно
прозрачность и под Win9x сделать — ручками и
головой, да уж больно лениво (и тормозить
будет). Поэтому под Win9x строчки с установкой
прозрачности надо из исходника убрать.
Проверка версии винды не помогает — при
запуске проги винда анализирует заголовок
exe’шника (а тот содержит функцию, которой нет
в winAPI) в результате прога выдаёт табличку
("Can’t load library") и работать отказывается. 

Окно произвольной формы и значок проги в
SystemTray — работают под любой виндой. 

Для того, чтобы работало контекстное меню
для значка в SystemTray надо просто положить
компонент TPopupMenu на форму и создать пункты
меню (по их количеству в исходнике).

Пример написан на C++ Builder, но на Delphi или VB
переделать — IMHO, никаких проблем. В файле
Unit1.h внутри объявления класса TForm1 в разделе
public надо ручками прописать следующее:

/* Функция, вызываемая при нажатии кнопки */
void __fastcall _Xakep(TObject *Sender);
/* Функции для работы со значком в SystemTray */
void __fastcall TrayShow(TMessage& Msg);
void __fastcall TrayMenu(TMessage& Msg);

/* Вводим необходимые сообщения винды для
работы значка в SystemTray */
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_USER+400,TMessage,TrayShow)
MESSAGE_HANDLER(WM_COMMAND,TMessage,TrayMenu)
END_MESSAGE_MAP(TForm)

Unit1.cpp привожу один в один:

//—————
#include <vcl.h>
#include <winuser.h>
#include <wingdi.h>
#pragma hdrstop

#include "Unit1.h"
//—————
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//—————
int oldX, oldY; /* Для перемещения окна за любую его
точку */
//—————
/* Описание функций для подвешивания значка
в SystemTray */
BOOL MyTaskBarAddIcon(HWND hwnd, HICON hicon, char *lpszTip);
BOOL MyTaskBarModifyIcon(HWND hwnd, HICON hicon, char *lpszTip);
BOOL MyTaskBarDeleteIcon(HWND hwnd);
//—————
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
BorderStyle = bsNone; /* Окно без заголовка */
int W = Form1->Width, H = Form1->Height; /* Сокращения 🙂 */
/* Координаты регионов окна ( в форме эмблемы
[X] ) */
POINT points[28] =
{
{0, 0}, {W/2-W/30, 0}, {W/2-W/30, H/2-H/10},
{W/2-W/6, H/2-H/10}, {W/2-W/6, H/6}, {0, H/6},

{W, 0}, {W/2+W/30, 0}, {W/2+W/30, H/2-H/10},
{W/2+W/6, H/2-H/10}, {W/2+W/6, H/6}, {W, H/6},

{0, H}, {W/2-W/30, H}, {W/2-W/30, H/2+H/10},
{W/2-W/6, H/2+H/10}, {W/2-W/6, H-H/6}, {0, H-H/6},

{W, H}, {W/2+W/30, H}, {W/2+W/30, H/2+H/10},
{W/2+W/6, H/2+H/10}, {W/2+W/6, H-H/6}, {W, H-H/6},

{W/2-W/6, H/2-H/15}, {W/2+W/6, H/2-H/15},
{W/2+W/6, H/2+H/15}, {W/2-W/6, H/2+H/15}
};
/* Количество точек в каждом регионе */
int poly_count[5] = {6, 6, 6, 6, 4};

/* Функция CreatePolyPolygonRgn требует указатели-константы
*/
const POINT *p = &points[0];
const int *polys = &poly_count[0];
HRGN Xakep = CreatePolyPolygonRgn(p, polys, 5, ALTERNATE);
/* Режем окно на регионы */
SetWindowRgn(Form1->Handle, Xakep, true);

/* ВНИМАНИЕ! Под Win9x эти строчки надо из
исходника убрать!
иначе прога просто не запускается — винда
анализирует
заголовок exe’шника и находит там функции,
которых в
библиотеках GDI нет!
(Зато под w2k — лепота!) */
/* ——————————————————- */
/* Делаем окно прозрачным */
SetWindowLong(Form1->Handle,
GWL_EXSTYLE,
GetWindowLong(Form1->Handle, GWL_EXSTYLE) |
WS_EX_LAYERED);
/* Число 128 — 50% прозрачности */
SetLayeredWindowAttributes(Form1->Handle,0,128,LWA_ALPHA);
/* ——————————————————- */

/* Создаём кнопку динамически и помещаем её
в центр окна */
TButton *button = new TButton(this);
button->Width = W/4;
button->Height = H/12;
button->Left = W/2 — button->Width/2;
button->Top = H/2 — button->Height/2;
button->Caption = "Xakep";
button->Parent=this;
/* Назначаем функцию, выполняющуюся при
нажатии кнопки */
button->OnClick = _Xakep;
}
//—————
/* Функция, вызываемая при нажатии кнопки */
/* Делает то же самое, что и в функции TrayShow —
показывает меню */
void __fastcall TForm1::_Xakep(TObject *Sender)
{
TPoint p;
GetCursorPos(&p);
SetForegroundWindow(Form1->Handle);
/* НЕ ЗАБУДЬ СОЗДАТЬ НА ФОРМЕ ОБЪЕКТ TPopupMenu
чтобы передать его Handle функции:
*/
TrackPopupMenuEx(PopupMenu1->Handle,
TPM_HORIZONTAL | TPM_LEFTALIGN,
p.x, p.y,
Form1->Handle,
NULL);
PostMessage(Form1->Handle,WM_USER,0,0);
}
//—————
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// Вешаем значок в SystemTray
MyTaskBarAddIcon(Form1->Handle, Form1->Icon->Handle, "Xakep’s Soft");
}
//—————
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
// При закрытии — удаляем значок из SystemTray
MyTaskBarDeleteIcon(Form1->Handle);
}
//—————
// Для перетаскивания окна за любую его
точку
//—————
void __fastcall TForm1::FormMouseDown(TObject *Sender, TMouseButton Button,
TShiftState Shift, int X, int Y)
{
oldX = X; oldY = Y;
}
//—————
void __fastcall TForm1::FormMouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
if(Shift.Contains(ssLeft))
{
Form1->Left += X — oldX;
Form1->Top += Y — oldY;
}
}
//—————
// Эти функции отвечают за управление
значком в SystemTray
//—————
BOOL MyTaskBarAddIcon(HWND hwnd, HICON hicon, char *lpszTip)
{
BOOL res;
/* Структура для хранения информации об
объекте в SystemTray*/
NOTIFYICONDATA tnid;

tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd; /* Окно — влвделец значка */
tnid.uID = 1; /* ID значка */
/* Флаги — показывать сообщения значку,
значок, всплывающую подсказку */
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
/* Сообщение от значка (пользовательское, т.е.
назначается тобой 🙂 */
tnid.uCallbackMessage = WM_USER+400;
/* Картинка для значка */
tnid.hIcon = hicon;
/* Указатель на строку содержащую
всплывающую подсказку */
strcpy(&tnid.szTip[0], lpszTip);

res = Shell_NotifyIcon(NIM_ADD, &tnid); /* Добавление значка
*/
return res;
/* Содержание остальных функций подобно, а
потому не комментируется */
}
//—————
/* В данной проге не используется, но если
захотите анимировать значок … */
BOOL MyTaskBarModifyIcon(HWND hwnd, HICON hicon, char *lpszTip)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = 1;
tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
tnid.uCallbackMessage = WM_USER+400;
tnid.hIcon = hicon;
strcpy(&tnid.szTip[0], lpszTip);
res = Shell_NotifyIcon(NIM_MODIFY, &tnid); /* Модификация
значка */
return res;
}
//—————
BOOL MyTaskBarDeleteIcon(HWND hwnd)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = 1;
res = Shell_NotifyIcon(NIM_DELETE, &tnid); /* Удаление значка
*/
return res;
}
//—————
/* Очень важная функция вызывает показ меню
когда тыкаешь мышкой на значок */
void __fastcall TForm1::TrayShow(TMessage& Msg)
{
/* По левой кнопке мышки прячем/показываем
окно программы */
if(Msg.LParam==WM_LBUTTONDOWN)
{
if(Form1->Visible)
{
Hide();
}
else
{
Show();
}
}

/* По правой кнопке мышки */
if(Msg.LParam==WM_RBUTTONDOWN)
{
TPoint p;
GetCursorPos(&p);
SetForegroundWindow(Form1->Handle);
/* НЕ ЗАБУДЬ СОЗДАТЬ НА ФОРМЕ ОБЪЕКТ TPopupMenu
чтобы передать его Handle функции:
*/
TrackPopupMenuEx(PopupMenu1->Handle,
TPM_HORIZONTAL | TPM_LEFTALIGN,
p.x, p.y,
Form1->Handle,
NULL);
PostMessage(Form1->Handle,WM_USER,0,0);
}
TForm::Dispatch(&Msg);
}
//—————
void __fastcall TForm1::TrayMenu(TMessage& Msg)
{
if(Msg.LParamLo==0)
{
/* Выполнение пунктов меню ЗДЕСЬ */
if(Msg.WParamLo==1)
{
Show();
}
if(Msg.WParamLo==2)
{
Hide();
}
if(Msg.WParamLo==3)
{
Close();
}
}
TForm::Dispatch(&Msg);
}
//—————

P.S. Вот на такую прогу с красивой мордой юзер
и позарится 🙂

Оставить мнение

Check Also

Скрытая сила пробела. Эксплуатируем критическую уязвимость в Apache Tomcat

В этой статье мы поговорим о баге в Apache Tomcat, популярнейшем веб-сервере для сайтов на…