![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Добрый день, Delphisources!
Мне нужна помощь: требуется написать программу, в которой нет окон + которая висит на панели уведомлений (где часы), т.е. у нее есть иконка. На иконке прикреплено Popup-меню, в котором есть кнопка выхода. Пока программа запущена, она отслеживает появление диска в DVD-ROM'е и выполняет определенные действия... Ну это подробности... Пример программы: MagicISO Virtual Disk 2.7 Напишите, если не сложно, примерчик "висюка" или дайте, пожалуйста, исходные код другой похожей программы... Заранее большое спасибо! |
|
#2
|
||||
|
||||
|
Помойму с delphi 2007 есть компонет TTrayIcon на вкладке Additional...
Используй его .... Если такого нет ищи по форуму здесь примеров до кучи, как сделать иконку в трее..... или гугл в помощь: http://www.google.ru/search?source=i...elphi&aq=f&oq= |
|
#3
|
||||
|
||||
|
Цитата:
Дело в том, что мне не иконку создать нужно (я пользуюсь TTrayIcon или TCoolTrayIcon), а написать программу, которая отслеживает сообщение WM_DEVICECHANGE в системе + в которой нет окон, т.е. она висит в трее. |
|
#4
|
||||
|
||||
|
Чтобы не было окон - надо удалить форму (Unit1), выбрать сам проект, нажать CTRL+V и убрать все строки про Application и объявление формы. Потом там надо написать саму прогу:
1) динамически создать эту самую трей-иконку прописать ручками все необходимые свойства 2) динамически создать меню -//- 3) присвоить трею менюшку. Это в свойствах. 4) написать обработчик менюшки "выход" и присвоить его в соответствующее поле (onClick определенного элемента) 5) загрузить DLL с хуком на сообщения и поставить оттуда хук. Вроде все. Или попроще, но некрасиво: написать обычную прогу, в которой на событии FormShow сделать Hide =) или, если не прокатит, можно создать поток, который будет постоянно делать так: Код:
while true do begin Form1.Hide; sleep(10); end; |
|
#5
|
||||
|
||||
|
Я не могу разобраться, почему сообщения для программы не обрабатываются в WindowProc??? Кучу исходников вспотрошил...
Код:
program MyApp;
uses Windows, Messages;
var
Msg: TMsg;
function WindowProc(Window: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
{ Здесь обработчики сообщений }
end;
begin
{ ... }
while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
{ ... }
end.Помогите люди, совсем запутался! Последний раз редактировалось GriLab, 30.11.2010 в 17:53. |
|
#6
|
|||
|
|||
|
На самом деле окно то тебе все-равно нужно. иначе некуда принимать сообщения. Просто в файле проекта тебе надо перед Application.Run написать Application.ShowMainForm := False;
|
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
Про трей: http://msdn.microsoft.com/en-us/library/aa969325.aspx (раздел Adding, Modifying, and Deleting Icons in the Status Area)
И по поводу обработки сообщений. Т.к. окон нет, то DispatchMessage бесполезен. Можно явно вызывать функцию обработки сообщений: Код:
program MyApp;
uses Windows, Messages;
var
Msg: TMsg;
function MsgProc(Window: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
{ Здесь обработчики сообщений }
end;
begin
{ ... }
while GetMessage(Msg, 0, 0, 0) do
MsgProc(Msg.hwnd, Msg.message, Msg.wparam, Msg.lparam);
{ ... }
end. |
|
#9
|
||||
|
||||
|
Спасибо всем. Если появятся новые идеи, то обязательно пишите. Буду очень благодарен!
|
|
#10
|
||||
|
||||
|
все, кроме работы с приводом - создание иконки в трее, появление popup-меню при клике на ней и 2 пунтка меню (exe 23кб, иконка в exe 7кб
):Код:
program CreateWindow;
{$R CreateWindow.res}
uses
ShellAPI,
Windows, Messages;
var
AWndClass: WNDCLASS;
AWnd: HWND;
AMsg: TMsg;
ANotifyIconData: TNotifyIconData;
AMenu: HMENU;
curpos: TPoint;
function WindowProc(AWnd: HWND; Msg: Integer; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
begin
case Msg of
WM_CREATE: begin
ZeroMemory(@ANotifyIconData, SizeOf(ANotifyIconData));
ANotifyIconData.cbSize:=SizeOf(ANotifyIconData);
ANotifyIconData.Wnd:=AWnd;
ANotifyIconData.uFlags:=NIF_ICON or NIF_TIP or NIF_MESSAGE;
ANotifyIconData.uCallbackMessage:=WM_USER+$1001;
ANotifyIconData.hIcon:=AWndClass.hIcon;
ANotifyIconData.szTip:='Medvedev O.V.'#13#10'Severodvinsk, 2010';
Shell_NotifyIcon(NIM_ADD, @ANotifyIconData);
AMenu:=CreatePopupMenu;
AppendMenu(AMenu, MF_STRING, 1, 'Exit');
AppendMenu(AMenu, MF_STRING, 2, 'About');
Result:=0;
end;
WM_DESTROY: begin
DestroyMenu(AMenu);
Shell_NotifyIcon(NIM_DELETE, @ANotifyIconData);
Result:=0;
end;
WM_CLOSE: begin
PostQuitMessage(0);
Result:=0;
end;
WM_COMMAND: begin
if HIWORD(wParam)=0 then
begin
if (LOWORD(wParam)=1) then PostQuitMessage(0)
else if (LOWORD(wParam)=2) then MessageBox(0, PChar('Medvedev O.V.'#13#10'Severodvinsk, 2010'), 'About', MB_OK or MB_SYSTEMMODAL);
end;
Result:=0;
end;
WM_USER+$1001: begin
case lParam of
WM_LBUTTONDOWN, WM_RBUTTONDOWN: begin
GetCursorPos(curpos);
TrackPopupMenu(AMenu, 0, curpos.X, curpos.Y, 0, AWnd, nil);
end;
end;
Result:=0;
end;
else Result:=DefWindowProc(AWnd, Msg, wParam, lParam);
end
end;
begin
AWndClass.Style:=0;
AWndClass.lpfnWndProc:=@WindowProc;
AWndClass.cbClsExtra:=0;
AWndClass.cbWndExtra:=0;
AWndClass.hInstance:=HInstance;
AWndClass.hIcon:=LoadIcon(HInstance, 'APPICON');
AWndClass.hCursor:=LoadCursor(0, IDC_ARROW);
AWndClass.hbrBackground:=HBRUSH(COLOR_WINDOW);
AWndClass.lpszMenuName:=nil;
AWndClass.lpszClassName:='TWINAPIFORM';
RegisterClass(AWndClass);
AWnd:=CreateWindowEx(
WS_EX_TOOLWINDOW,
AWndClass.lpszClassName,
AWndClass.lpszClassName,
WS_POPUP,
0, 0, 0, 0, 0, 0,
HInstance,
nil);
while GetMessage(AMsg, 0, 0, 0) do
begin
TranslateMessage(AMsg);
DispatchMessage(AMsg);
end;
DestroyWindow(AWnd);
UnregisterClass(AWndClass.lpszClassName, HInstance);
ExitProcess(0);
end.http://data.cod.ru/78766 архив живет 3 дня!!! Последний раз редактировалось NumLock, 08.12.2010 в 10:10. |
|
#11
|
||||
|
||||
|
Спасибо. Тема закрыта!
|