Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.11.2010, 10:09
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
Восклицание Приложение Delphi без окон

Добрый день, Delphisources!

Мне нужна помощь: требуется написать программу, в которой нет окон + которая висит на панели уведомлений (где часы), т.е. у нее есть иконка. На иконке прикреплено Popup-меню, в котором есть кнопка выхода.

Пока программа запущена, она отслеживает появление диска в DVD-ROM'е и выполняет определенные действия... Ну это подробности...

Пример программы: MagicISO Virtual Disk 2.7

Напишите, если не сложно, примерчик "висюка" или дайте, пожалуйста, исходные код другой похожей программы...

Заранее большое спасибо!
Ответить с цитированием
  #2  
Старый 26.11.2010, 10:17
Аватар для Dead_Gigabit
Dead_Gigabit Dead_Gigabit вне форума
Начинающий
 
Регистрация: 20.10.2009
Адрес: Там где холодно и сыро.... брр
Сообщения: 135
Версия Delphi: Delphi XE
Репутация: 10
По умолчанию

Помойму с delphi 2007 есть компонет TTrayIcon на вкладке Additional...
Используй его ....
Если такого нет ищи по форуму здесь примеров до кучи, как сделать иконку в трее.....

или гугл в помощь: http://www.google.ru/search?source=i...elphi&aq=f&oq=
Ответить с цитированием
  #3  
Старый 26.11.2010, 10:34
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Цитата:
Сообщение от Dead_Gigabit
Помойму с delphi 2007 есть компонет TTrayIcon на вкладке Additional...
Используй его ....
Если такого нет ищи по форуму здесь примеров до кучи, как сделать иконку в трее.....

или гугл в помощь: http://www.google.ru/search?source=i...elphi&aq=f&oq=

Дело в том, что мне не иконку создать нужно (я пользуюсь TTrayIcon или TCoolTrayIcon), а написать программу, которая отслеживает сообщение WM_DEVICECHANGE в системе + в которой нет окон, т.е. она висит в трее.
Ответить с цитированием
  #4  
Старый 26.11.2010, 11:58
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Чтобы не было окон - надо удалить форму (Unit1), выбрать сам проект, нажать CTRL+V и убрать все строки про Application и объявление формы. Потом там надо написать саму прогу:
1) динамически создать эту самую трей-иконку
прописать ручками все необходимые свойства
2) динамически создать меню
-//-
3) присвоить трею менюшку. Это в свойствах.
4) написать обработчик менюшки "выход" и присвоить его в соответствующее поле (onClick определенного элемента)
5) загрузить DLL с хуком на сообщения и поставить оттуда хук.
Вроде все.

Или попроще, но некрасиво:
написать обычную прогу, в которой на событии FormShow сделать Hide =)
или, если не прокатит, можно создать поток, который будет постоянно делать так:
Код:
while true do
begin
  Form1.Hide;
  sleep(10);
end;
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #5  
Старый 29.11.2010, 16:22
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Я не могу разобраться, почему сообщения для программы не обрабатываются в 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  
Старый 29.11.2010, 17:29
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

На самом деле окно то тебе все-равно нужно. иначе некуда принимать сообщения. Просто в файле проекта тебе надо перед Application.Run написать Application.ShowMainForm := False;
Ответить с цитированием
  #7  
Старый 30.11.2010, 17:30
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Цитата:
Сообщение от lmikle
На самом деле окно то тебе все-равно нужно. иначе некуда принимать сообщения. Просто в файле проекта тебе надо перед Application.Run написать Application.ShowMainForm := False;
Дело в том, что я пишу программу на чистом API без использрвания VCL
Ответить с цитированием
  #8  
Старый 30.11.2010, 18:57
Аватар для KOOL
KOOL KOOL вне форума
Активный
 
Регистрация: 06.01.2008
Адрес: Рязань
Сообщения: 306
Версия Delphi: 2009
Репутация: 6150
По умолчанию

Про трей: 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  
Старый 07.12.2010, 23:18
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Спасибо всем. Если появятся новые идеи, то обязательно пишите. Буду очень благодарен!
Ответить с цитированием
  #10  
Старый 08.12.2010, 10:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

все, кроме работы с приводом - создание иконки в трее, появление 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  
Старый 01.01.2011, 02:44
Аватар для GriLab
GriLab GriLab вне форума
Начинающий
 
Регистрация: 26.11.2010
Адрес: Минск
Сообщения: 190
Версия Delphi: XE 15.0.3890
Репутация: 415
По умолчанию

Спасибо. Тема закрыта!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:33.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter