Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2008, 13:51   #11
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от The_Darkness Посмотреть сообщение
помимо repeat until false; можно и еще что нибудь написать. Объясните пожлуйста как в консоли обработать сообщение от иконки трея, если не знаете или лень объяснять, не надо пожалуйста убеждать меня что форма лучше и т.д. Я понимаю что в форме это намного проще сделать, я даже знаю как, но мне надо именно в консоли
The_Darkness, с таким же успехом можно сказать, что это Вам лень даже пользоваться поиском. Такие вопросы рассматривались тыщу раз. И подумайте, где кончается "консоль" и начинаются "формы". И существует ли вообще грань между ними.

Код:
uses
    windows, messages, shellapi;

const
    ClassName      : PCHAR = '_MyWindowClass_';
    HelloWorld     = 'Hello World!';

function MyWndProc (
            _hWnd : HWND;
            msg : UINT;
            _wParam : WPARAM;
            _lParam : LPARAM) : LRESULT; stdcall;
const
    WM_NAICON           = WM_USER + 10;
    IconID              : cardinal = 1;
    MENU_HELLO          = 1;
    MENU_EXIT           = 3;
var
    nid     : NOTIFYICONDATA;
    menu    : HMENU;
    msgpos  : TPoint;

begin
    case msg of
        WM_CREATE:
            begin
                nid.cbSize  := sizeof(nid);
                nid.Wnd     := _hWnd;
                nid.uID     := IconID;
                nid.uFlags  := NIF_MESSAGE OR NIF_ICON OR NIF_TIP;
                nid.uCallbackMessage := WM_NAICON;
                nid.hIcon   := LoadIcon(0, MAKEINTRESOURCE(IDI_QUESTION));
                nid.szTip   := HelloWorld;

                Shell_NotifyIcon(NIM_ADD, @nid);
            end;
        WM_DESTROY:
            begin
                ZeroMemory(@nid, sizeof (nid));
                nid.Wnd := _hWnd;
                nid.uID := IconID;
                nid.uFlags  := NIF_ICON OR NIF_TIP;
                Shell_NotifyIcon(NIM_DELETE, @nid);

                PostQuitMessage(0);
            end;
        WM_NAICON:
            begin
                if _wParam = IconID then begin
                    case _lParam of
                        WM_RBUTTONDOWN:
                            begin
                                GetCursorPos(msgpos);
                                menu := CreatePopupMenu();

                                AppendMenu(menu, MF_STRING, MENU_HELLO, HelloWorld);
                                AppendMenu(menu, MF_SEPARATOR, 0, 0);
                                AppendMenu(menu, MF_STRING, MENU_EXIT, 'Exit');

                                TrackPopupMenu(
                                        menu,
                                        TPM_LEFTBUTTON,
                                        msgpos.X,
                                        msgpos.Y,
                                        0,
                                        _hWnd,
                                        nil);
                                PostMessage(_hWnd, WM_NULL, 0, 0);
                                DestroyMenu(menu);
                            end
                    end;
                end;
            end;
            WM_COMMAND:
                if HIWORD(_wParam) = 0 then begin
                    case LOWORD(_wParam) of
                        MENU_EXIT:
                            DestroyWindow(_hWnd);
                        MENU_HELLO:
                            MessageBox(
                                    _hWnd,
                                    HelloWorld,
                                    HelloWorld,
                                    MB_OK OR MB_ICONINFORMATION);
                    end;
                end;
            WM_WINDOWPOSCHANGING:
                begin
                    (PWINDOWPOS (_lParam)).flags := (PWINDOWPOS (_lParam)).flags AND (NOT SWP_SHOWWINDOW);
                    (PWINDOWPOS (_lParam)).flags := (PWINDOWPOS (_lParam)).flags OR SWP_HIDEWINDOW;
                    result := 0;
                    exit;
                end;
    end;

    result := DefWindowProc(_hWnd, msg, _wParam, _lParam);
end;


var
    wc      : WNDCLASS;
    _msg    : MSG;

begin

    ZeroMemory(@wc, sizeof (wc));
    wc.lpfnWndProc  := @MyWndProc;
    wc.lpszClassName:= ClassName;

    if RegisterClass(wc) <> 0 then begin
        if CreateWindow(ClassName, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) <> 0 then begin
            while GetMessage(_msg, 0, 0, 0) do begin
                if _msg.message = WM_QUIT then PostQuitMessage(0);
                TranslateMessage(_msg);
                DispatchMessage(_msg);
            end;
        end;
    end;
end.
B_N вне форума Ответить с цитированием
Старый 15.07.2008, 14:30   #12
The_Darkness
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 83
По умолчанию

Благодарю. То есть, консольное приложение создает окно, которое и получает сообщения, я верно понял?
Прогрессирующий чайник..
The_Darkness вне форума Ответить с цитированием
Старый 15.07.2008, 15:06   #13
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
То есть, консольное приложение создает окно, которое и получает сообщения, я верно понял?
Верно. отсюда вывод - консольное тебе не нужно, против чего ты и спорил вот уж десяток постов. Вероятно тебе нужен был код на халяву (уж извини за флуд...)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2008, 15:12   #14
The_Darkness
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 83
По умолчанию

Нет, мне нужно было узнать как обработать сообщения от иконки трея. И мне надо было именно консольное, так как такой же вариант, но в форме у меня уже есть) А вообще спасибо всем,в особеннсотиB_N я узнал то что хотел)
Прогрессирующий чайник..
The_Darkness вне форума Ответить с цитированием
Старый 15.07.2008, 15:37   #15
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Я конечно могу жутко заблуждаться но помоему если в проге есть хоть одно создаваемое окно, окромя всяких диалогов стандартных типа сообщений, то это уже оконное приложение.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2008, 15:49   #16
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Нет никаких приципиальных различий между "консольными" и "оконными" приложениями. Хотя мы постоянно пользуемся этими терминами, фактически - это всего лишь пресеты среды разработки, когда одно приложение сразу регистрирует консоль и прикручивает к ней хэндлы стандартных файлов, а другое - не делает этого, а начинает с создания окон и запуска модального цикла. Нет никаких запретов на то, чтобы создавать консоль из "оконного" приложения. И даже ещё проще создать окна в "консольном", так что разница между ними очень иллюзорная...
B_N вне форума Ответить с цитированием
Старый 15.07.2008, 15:55   #17
The_Darkness
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 83
По умолчанию

Прошу прощения если вопрос тупой, просто я практически ламер(( А может приложение не регистрировать консоль и не создавать окон?
Прогрессирующий чайник..
The_Darkness вне форума Ответить с цитированием
Старый 15.07.2008, 16:05   #18
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от The_Darkness Посмотреть сообщение
А может приложение не регистрировать консоль и не создавать окон?
Может. Большинство служб именно так и работает. Только тогда нужно предусмотреть способ "загнать" программу в какой-нибудь цикл. И способ управления ей, естественно.
B_N вне форума Ответить с цитированием
Старый 15.07.2008, 16:07   #19
The_Darkness
Пользователь
 
Регистрация: 06.01.2008
Сообщений: 83
По умолчанию

Ясно, огромное спасибо Пойду читать что такое службы :D
Прогрессирующий чайник..
The_Darkness вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
проблема с показом формы после трея za4ot Общие вопросы Delphi 4 21.08.2008 12:35
Форма поверх трея Ozerich Общие вопросы Delphi 1 04.08.2008 03:05
Перехват и обработка сообщений Mail.ru агента NikLik Работа с сетью в Delphi 4 22.07.2008 15:39
Перехват сообщений от Службы сообщений (Messenger) SJMS Win Api 6 17.07.2008 10:26
Нарушение прав иконок трея joker Win Api 4 24.11.2007 07:33