C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Программа в трее — нужно назначить горячие кнопки
Andrey24
Отправлено: 26.07.2006, 11:11


Не зарегистрирован







Задача такая: началось с того, что неудобно вытаскивать компакт-диски из привода, так как фальш панель не имеет кнопки в открытом состоянии, вообщем это лирика... Написал небольшую прогу, которая сворачивается в трэй, там менюшка из 4х пунктов
О программе
Выход
Открыть
Закрыть
Так вот, как открывать или закрывать лоток по горячей клавише, а то тоже неудобно каждый раз метиться в иконку в трее?
И попутно, может кто знает, как сделать так, чтобы меню само исчезало, если кликнуть по рабочему столу, а то приходится что-нибудь выбирать в меню, даже если не надо?

Программировать не умею, просто жизнь заставила smile.gif
Заранее спасибо.
Dark40000
Отправлено: 29.07.2006, 22:39


Ученик-кочегар

Группа: Участник
Сообщений: 6



Прива.
Я сам здесь новичек, счас вопрос тоже задавать буду. Заглянул сюда — и сразу захотелось ответить smile.gif Во 1-ых можно вообщем скачать такую прогу, точно есть такие, но ет получается типа не интерестно wink.gif
А вообще сам еще не разобрался, тоже делал прогу что типа в трее и нада по горячим клавишам ее вызывать, так и не доделал... а счас опять взялся за нее, кароч блин здесь типа ето процедура чтоли называется Хук, типа следит на что нажимает пользователь и реагирует... в них оч мне сложно разобраться было.. но счас вроде дело пойдет, исходник более-менее норм скачал, счас буду сидеть додумывать smile.gif
Так что если тебе это еще надо и ты понял че я тут накалякал — отпишись — дам исходник нормальный или пойсчи в нете Хук, Хуки С++ или чет типа того. надеюсь хоть чемнить те помог=)
Andrey24
Отправлено: 31.07.2006, 05:48


Не зарегистрирован







ОК, поищу. Что-то квёлый форум какой-то, то ли все отдыхают, то ли влом отвечать smile.gif
Gedeon
Отправлено: 31.07.2006, 08:18


Ветеран

Группа: Модератор
Сообщений: 1742



Потому что такие вопросы тут не 1 раз обсуждались и воду в ступе толочь никто не хочет, ищите по форуму слово хук или hook.

Если сидюков несколько то управлять ими трохи сложнее
вот код проги рисующей на форме для каждого сидюка кнопарь открыть и закрыть.
CODE

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

#define BUFSIZE 512
TCHAR szTemp[BUFSIZE];

static int i = 15;
if (GetLogicalDriveStrings(BUFSIZE-1, szTemp))
{
TCHAR szDrive[3] = TEXT(" :");
BOOL bFound = FALSE;
TCHAR* p = szTemp;

do
{
// Copy the drive letter to the template string
*szDrive = *p;

if(GetDriveType(szDrive)==DRIVE_CDROM)
{
TButton *btn = new TButton(this);
btn->Top = i;
btn->Width = 40;
btn->Caption = szDrive;
btn->Parent = this;
btn->OnClick = btn1Click;

btn = new TButton(this);
btn->Left = 41;
btn->Top = i;
btn->Width = 40;
btn->Caption = szDrive;
btn->Parent = this;
btn->OnClick = btn2Click;

i=i+25;
}

// Go to the next NULL character.
while (*p++);
} while (!bFound && *p); // end of string
}
this->Height = i+27;
this->Width = 87;

}
//---------------------------------------------------------------------------

void __fastcall TForm1::btn1Click(TObject *Sender)
{
TButton *btn = dynamic_cast<TButton*> (Sender);

DriveLetter = "\\\\.\\" + btn->Caption;
hCDDevice = CreateFile(DriveLetter.c_str(),
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if(hCDDevice!=INVALID_HANDLE_VALUE)
{
DeviceIoControl(hCDDevice,/*IOCTL_DISK_EJECT_MEDIA*/0x074808,NULL,0,NULL,0,&lpBytesReturned,NULL);
CloseHandle(hCDDevice);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btn2Click(TObject *Sender)
{
TButton *btn = dynamic_cast<TButton*> (Sender);
DriveLetter = "\\\\.\\" + btn->Caption;

hCDDevice = CreateFile(DriveLetter.c_str(),
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if(hCDDevice!=INVALID_HANDLE_VALUE)
{
DeviceIoControl(hCDDevice,/*IOCTL_DISK_LOAD_MEDIA*/0x07480C,NULL,0,NULL,0,&lpBytesReturned,NULL);
CloseHandle(hCDDevice);
}
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{

for(int i=0; i<this->ComponentCount; i++)
{

TButton *btn = dynamic_cast<TButton*> (this->Components[i]);
if(btn)
{
delete btn;
i=0; // так как кол-во компонентов изменилось, то цикл проходим заново
}
}
}
//---------------------------------------------------------------------------

расчет высоты и ширины формы у меня не обязательно правильный для вас, но такие мелочи думаю асилить можно.

Отредактировано Gedeon — 31/07/2006, 08:20

Вернуться в Вопросы программирования в C++Builder