scraper
Гость
|
|
« : 07-06-2006 21:28 » |
|
Привет. Помогите, пожалуйста доработать прогу, чтобы иконка в трей добавлялась (и по клику правой мышкой диалог открывался), в панель Пуск->Все программы, в реестр, на рабочий стол.
#include<iostream.h> int main() {
cout<<"Hello, world!";
return 0; }
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #1 : 08-06-2006 08:37 » |
|
scraper, про трей рыскай тут, мне щас некогда искать - на обеде я https://forum.shelek.ru/index.php?topic=8674.0пост №20
|
|
« Последнее редактирование: 08-06-2006 08:42 от Алексей1153 »
|
Записан
|
|
|
|
Hooter
|
|
« Ответ #2 : 08-06-2006 09:07 » |
|
Привет. Помогите, пожалуйста доработать прогу, чтобы иконка в трей добавлялась (и по клику правой мышкой диалог открывался), в панель Пуск->Все программы, в реестр, на рабочий стол.
#include<iostream.h> int main() {
cout<<"Hello, world!";
return 0; }
Ну прям клуб весёлых и находчивых
|
|
|
Записан
|
|
|
|
npak
|
|
« Ответ #3 : 08-06-2006 09:28 » |
|
Особенной умиляет "доработать"
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #4 : 08-06-2006 10:04 » |
|
иконка в реестр,ну-ну... да, вроде, и прога консольная... нафига, ей в трэе иконка? А ярлыки добавлять при каждом запуске? прикольно... и о чем будет диалог (по клику правой _мышкой_)? если мышку положить слева - диалог не должен открываться? PS: ты шутишь - и мы шутим
|
|
« Последнее редактирование: 08-06-2006 10:09 от PooH »
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #5 : 08-06-2006 10:11 » |
|
помогите довести до ума проект операционки!!! пока сделал только:
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
scraper
Гость
|
|
« Ответ #6 : 08-06-2006 18:40 » |
|
Ладно, будем резать по частям:
Как прогу добавить в трей? То есть что бы при закрытии, она не уничтожалась полностью, а ее можно было опять вызвать по клику левой кнопкой мыши по значечку в нижнем правом углу?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 08-06-2006 18:51 » |
|
scraper, прогу в трей нельзя добавить, можно только прописать там иконку. Которая может посылать сообщения приложению, его прописавшему - ссылку я тебе дал, смотри
|
|
« Последнее редактирование: 08-06-2006 18:54 от Алексей1153 »
|
Записан
|
|
|
|
scraper
Гость
|
|
« Ответ #8 : 08-06-2006 19:01 » |
|
Алексей1153, Я просмотрел, там нет ничего... ((
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #9 : 08-06-2006 19:06 » |
|
scraper, хм... щас я попробую .... там вот что: Q: как создать иконку в области уведомлений (трее)? как определить, какие действия прпоизводит с иконкой юзверь? как сделать анимацию иконки в трее? как удалить иконку? A:для всего - использовать процедуру API - Shell_NotifyIcon(). Например, сделаем так, чтобы по нажатию кнопки меню окно программы сворачивалось в трей (иконка сначала недолго поморгает), а при щелчке левой кнопкой мыши по иконке - разворачивалось к предыдущему состоянию. В примере использовано однодокументное приложение, поэтому "всё происходит" в классе CMainFrame. Переписать для CDialog и вообще для любого случая - несложно. //определение класса CMainFrame class CMainFrame : public CFrameWnd { //переменная для сохранения состояния окна до сворачивания. //"Запоминаем" сюда значения SW_MAXIMIZE или SW_RESTORE DWORD m_dwdTrayShowCMD; //определяем константы enum { //идентификатор иконки приложения в трее. //не путать с ID ресурса иконки!!! e_tray_ID=1000, e_tray_ID_1=1001, //(ID второй иконки для анимации) e_tray_MSG=WM_COMMAND,//сообщение, посылаемое из трея }; ... ... //это добавит визард -> // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CMainFrame) ... ... protected: virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam); //}}AFX_VIRTUAL };
//конструктор CMainFrame::CMainFrame() { m_dwdTrayShowCMD=SW_MAXIMIZE; }
//обработчик кнопки меню "свернуть в трей" (ID_PUTTOTRAY) void CMainFrame::OnPuttotray() { //"запоминаем", какой командой потом разворачивать окно m_dwdTrayShowCMD=((GetStyle()&WS_MAXIMIZE)?SW_MAXIMIZE:SW_RESTORE); //заполняем структуру NOTIFYICONDATA для иконки NOTIFYICONDATA ndata= { //размер структуры sizeof(NOTIFYICONDATA), //хендл этого окна m_hWnd, //идентификатор иконки трея в приложении e_tray_ID, //опции: есть иконка, есть сообщение, есть надпись NIF_ICON|NIF_MESSAGE|NIF_TIP, //сообщение, посылаемое иконкой из трея (сейчас == WM_COMMAND) e_tray_MSG, //иконка из ресурсов ::AfxGetApp()->LoadIcon(IDR_MAINFRAME), //всплывающая надпись "Значок моей программы" }; //заполняем структуру NOTIFYICONDATA для "пустой" иконки NOTIFYICONDATA ndata1=ndata; ndata1.hIcon=0; //скрываем окно программы ShowWindow(SW_HIDE); //добавляем значок e_tray_ID в трей Shell_NotifyIcon(NIM_ADD,&ndata); //"моргаем" 4 раза for(int i=0;i<4;i++) { //заменяем значок в трее пустым Shell_NotifyIcon(NIM_MODIFY,&ndata1); Sleep(70); //возвращаем обратно иконку Shell_NotifyIcon(NIM_MODIFY,&ndata); Sleep(70); } return; }
добавим обработчик для команды e_tray_MSG (==WM_COMMAND) - переопределим виртуальную функцию BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam) BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam) { //определяем, что сообщение от иконки e_tray_ID if(wParam==e_tray_ID) { //определяем, какое действие мышью произвели switch(lParam) { case WM_LBUTTONDOWN: { //показываем окно ("запомненной" командой) ShowWindow(m_dwdTrayShowCMD); //заполняем структуру для удаления иконки NOTIFYICONDATA ndata= { sizeof(NOTIFYICONDATA), m_hWnd, e_tray_ID }; //удаляем иконку Shell_NotifyIcon(NIM_DELETE,&ndata); } break; case WM_MOUSEMOVE: { //по иконке двигался курсор } break; case WM_LBUTTONUP:{}break; case WM_LBUTTONDBLCLK:{}break; case WM_RBUTTONDOWN:{}break; case WM_RBUTTONUP:{}break; case WM_RBUTTONDBLCLK:{}break; case WM_MBUTTONDOWN:{}break; case WM_MBUTTONUP:{}break; case WM_MBUTTONDBLCLK:{}break; } //сообщение обработано return 1; } return CFrameWnd::OnCommand(wParam, lParam); }
|
|
|
Записан
|
|
|
|
scraper
Гость
|
|
« Ответ #10 : 08-06-2006 19:13 » |
|
Алексей1153, Спасибо большое. Это лучше в Borland C++ Buildere 6.0 делать? Само написаное куда вставлять-то?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 08-06-2006 19:18 » |
|
scraper, это, в принципе, практически АПИ (хотя mfc). То есть переделать несложно и в билдер, я думаю. Но этот пример я писал в VC++6
|
|
|
Записан
|
|
|
|
scraper
Гость
|
|
« Ответ #12 : 08-06-2006 19:24 » |
|
Алексей1153, спасибо огромное, Алексей, но мне бы надо на Builder-е, Что конкретно мне надо: Научиться в трей сварачивать, в регистры прописывать, в панель Пуск добавлять. На Builder как это делается? И еще: работа с регистрами, есть ссылка, объясняющая это? Зачем ключ в регистр добавлять?
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #13 : 08-06-2006 19:45 » |
|
scraper, как иконки делать - не подскажу, не разбирался... А какие регистры? РЕЕСТР . что ты хочешь туда записать? С реестром я работал, имеется даже собственная библиотечка, но опять же не под билдер
|
|
|
Записан
|
|
|
|
scraper
Гость
|
|
« Ответ #14 : 08-06-2006 19:51 » |
|
Алексей1153, вот здорово! Слушай, пока теория: Ключ проги в реестр добавляют чтобы бысто ее запускать. Так? Еще есть что-нибудь, в смысле, зачем это нужно? Ключ что это? Если ответить гуманитарным языком. С примером (маленьким). Практика: Как програмно из проги добавить ключ в реестр, соответственно иконку вывести на раб.стол или в Пуск. О!
|
|
|
Записан
|
|
|
|
RXL
|
|
« Ответ #15 : 08-06-2006 19:55 » |
|
scraper, реестр - древовидная база данных (статических и динамических). Хранят там все, что не попадя.
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 08-06-2006 20:02 » |
|
scraper, ты не понимаешь ... А я не учитель - расскажу как сможу: реестр содержит дерево записей. Там обычно хранятся настройки программ и системы, прописаны стандартные и нестандартные пути к файлам и т.д. ключ - это корень одного из деревьев( или подключи - ветви дерева), стандартные (их ставит сама винда, их низя удалять): HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS HKEY_CURRENT_CONFIG дерево содержит подключи, которые могут содержать параметры. Параметрам присваивается значение - настройки и т.д. Сам по себе реестр ничего не делает - просто огромный текстовый файл. И лазить тебе туда рановато - замочишь систему Литературу не подскажу - не знаю, ищи в поисковых системах
|
|
|
Записан
|
|
|
|
scraper
Гость
|
|
« Ответ #17 : 08-06-2006 20:09 » |
|
Алексей1153, Я придерживаюсь принципа, раз голова залезла, значит нужно и плечи просовывать.
Можно примерчик, только не большой, как прогу на Builder-е, в реестр запихнуть? И потом как с этим ключом работать, тоесть мне нужна иконка, где-нибудь, щелкнул, и вот вам, пожалуйста, моя прога.
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 08-06-2006 20:16 » |
|
прогу в принципе можно запихнуть в реестр ) но этого разве что вирусы только делают. для ярлыка функции есть, но сейчас не нашёл... мож кто подскажет
|
|
|
Записан
|
|
|
|
scraper
Гость
|
|
« Ответ #19 : 08-06-2006 20:40 » |
|
Алексей1153, Зачем вирусы это делают? И функцию я бы очень хотел, с маленьким примерчиком (очень маленьким), если не трудно, ...
|
|
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 08-06-2006 21:18 » |
|
вирусы - работа у них такая пример, как я пользую : //прочитать DWORD параметр из ключа реестра bool CFileMinder::_R_ReadRegKeyDWDParam(HKEY k,CString& parName,DWORD* value) { DWORD type=REG_DWORD;//тип параметра - DWORD DWORD datalen=4; return(ERROR_SUCCESS==RegQueryValueEx(k,parName,0,&type,(BYTE*)(value),&datalen)); }
//создать DWORD параметр в ключе реестра bool CFileMinder::_R_SaveRegKeyDWDParam(HKEY k,CString& parName,DWORD* value) { return (ERROR_SUCCESS==RegSetValueEx(k,parName,0,REG_DWORD,(BYTE*)value,4)); }
примерно так...
|
|
|
Записан
|
|
|
|
PooH
Глобальный модератор
Offline
Пол:
... и можно без хлеба!
|
|
« Ответ #21 : 09-06-2006 05:09 » |
|
Вот пример работы с реестром на билдере: http://www.softholm.com/articles/register.htmlЗачем вирусы это делают? по разным причинам... например, есть специальный ключ, такой что если в него прописать путь для запуска проги, то винда ее запустит сразу после своего старта... к ярлыкам реестр не имеет никакого отношения. а здесь http://sources.ru/builder/faq/015.html про создание ярлыков
|
|
|
Записан
|
Удачного всем кодинга! -=x[PooH]x=-
|
|
|
scraper
Гость
|
|
« Ответ #22 : 10-06-2006 20:44 » |
|
Спасибо, буду разгребать...
|
|
|
Записан
|
|
|
|
|