На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
Страницы: (3) 1 [2] 3  все  ( Перейти к последнему сообщению )  
> Надпись на часах в трее , Решил я подурачиться... ;)
    Цитата Krid @
    сделать сабклассинг TrayClockWClass

    Не понял... :huh:
    Т.е. создать окно с таким же названием класса? :huh:

    ЗЫ - Пойду update для Tauscan'а скачаю :D
    Сообщение отредактировано: drinkOut -
      Сабклассинг - это когда твоя программа перехватывает на себя все мессаги от некого окна.
      Суперклассинг - это создание нового класса окна на базе уже существующего класса. При этом имя нового класса должно быть другим.
      Жаль, что
      Цитата
      для встраивания окон в трей, увы, интерфейсов не сделали. Так что тут все по-старинке
      :'(
        Усёк ;)

        Сообщения были разделены в тему "Проблемы с треем"
          вот тоже захотелось часики перерисовать... и вот проблема в том, что хочется оставить фон от темы, т.е. запретить explorer туда рисовать... как это наиболее красиво сделать? почитал про sublassing, на своем тестовом контроле вроде все получается, а при попытки внедриться ничего не происходит... (
            А как внедряешься и что именно не получается?
              Alex Forth
              Цитата Alex Forth @
              А как свое окошко в трей внедрить?


              Может быть вот так...
              ExpandedWrap disabled
                procedure TForm1.FormCreate(Sender: TObject);
                var h,tnd:THandle;
                    R:TRect;
                begin
                Color:=clRed;
                BorderStyle:=bsNone;
                h := FindWindow('Shell_TrayWnd',nil);
                tnd :=FindWindowEx(h,0,'TrayNotifyWnd',nil);
                 GetWindowRect(tnd,r);
                 SetWindowPos(form1.Handle,HWND_TOPMOST,
                 r.Left,r.Top,r.Right,r.Bottom, SWP_SHOWWINDOW);
                end;


              P.S. попробуй вызвать вот так если верить MSDN то должен вставить прямо в трей.
              SetWindowPos(form1.Handle,
              tnd,//Дескриптор окна куду будет вставленна окошко после позиционирования
              //Но я лично не очень сильно верю. Хотя ... ты можешь проверить сам. :yes:
              r.Left,r.Top,r.Right,r.Bottom, SWP_SHOWWINDOW);
                Цитата aster_x @
                Может быть вот так...

                А внедриться в процесс Explorer'а не забыл? Да и что-то сабклассинга TrayClockWClass не видать..
                  ExpandedWrap disabled
                    procedure TForm1.Timer1Timer(Sender: TObject);
                    var
                      hTrayClock  : HWND;
                      DC, DC2,DC3:HDC;
                      r:TRect;
                      lt: TSYSTEMTIME;
                      cdr,h,m,s,day, date: string;
                    begin
                      GetLocalTime(lt);
                      if lt.wHour<10 then h := '0' + IntToStr(lt.wHour) else h:=IntToStr(lt.wHour);
                      if lt.wMinute<10 then m := '0' + IntToStr(lt.wMinute) else m:=IntToStr(lt.wMinute);
                      if lt.wSecond<10 then s := '0' + IntToStr(lt.wSecond) else s:=IntToStr(lt.wSecond);
                      day := '   '+FormatDateTime('dddd',Now)+ '        ';
                      cdr := '   '+h + ':' +  m + ':' + s + '         ';
                      date:= ' '+ IntToStr(lt.wDay) + '.' + IntToStr(lt.wmonth) + '.' + IntToStr(lt.wYear)+ '         ';
                      hTrayClock := FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'TrayClockWClass',nil);
                      GetWindowRect(hTrayClock,r);
                      DC := GetDC(0);
                      DC2 := GetDC(0);
                      DC3 := GetDC(0);
                      SetTextColor(DC, RGB(0,$0FF,0));
                      SetTextColor(DC2, RGB(0,$0FF,0));
                      SetTextColor(DC3, RGB(0,$0FF,0));
                      SetBkColor(DC,RGB(0,0,0));
                      SetBkColor(DC2,RGB(0,0,0));
                      SetBkColor(DC3,RGB(0,0,0));
                      TextOut(DC, r.Left, r.Top, Pchar(cdr), length(cdr));
                      TextOut(DC2, r.Left, r.Top+16, Pchar(day), length(day));
                      TextOut(DC3, r.Left, r.Top+32, Pchar(date), length(date));
                      ReleaseDC(hTrayClock, DC);
                      ReleaseDC(hTrayClock, DC2);
                      ReleaseDC(hTrayClock, DC3);
                    end;
                     
                    procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
                    var
                      Wnd: THandle;
                    begin
                      Wnd := FindWindow('Shell_TrayWnd', nil);
                      Wnd := FindWindowEx(Wnd, HWND(0), 'TrayNotifyWnd', nil);
                      Wnd := FindWindowEx(Wnd, HWND(0), 'TrayClockWClass', nil);
                      ShowWindow(Wnd, SW_hide);
                      ShowWindow(Wnd, SW_show);
                    end;

                  user posted image
                  Сообщение отредактировано: pris -
                    Вот в интернете нашёл: http://www.xakep.ru/post/19333/default.asp
                    Но почему-то замена часов в windows 7 не работает, а в XP работает. Почему так?
                      Разобрался, хотя не полностью, но вроде оконная процедура часов меняется в windows 7. Код нуждается в тщательной доработке. Но пока такой вариант. Если можно сделать проще то подскажите как?
                      Прикреплённый файлПрикреплённый файлClock.rar (2,15 Кбайт, скачиваний: 162)
                      Сообщение отредактировано: Nikfel -
                        Цитата Nikfel @
                        Код нуждается в тщательной доработке

                        Есессно :yes: Код писАлся под XP.
                        Твой код пока не смотрел. Если он работает во всех NT-осях (начиная с XP) - прямая ему дорога в ФАК :yes:
                          Вот переделал код по другому, но есть много не решённых вопросов:
                          После появления часов в трее ширина часов не меняется, пришлось писать свою процедуру для изменения ширины часов только после загрузки часов. Причём пришлось использовать showwindow для скрытия окна трея и показа его, иначе глюки с графикой(invalidaterect не помогала). Код нуждается в доработке. В коде я учитывал ширину TrayShowDesktopButtonWClass как равную 15, а в XP такого компонента нет, поэтому лучше бы получать ширину этого объекта через GetClientRect.
                          Ещё так и не разобрался как отловить щелчок левой или правой кнопкой мыши по часам в трее? Хотя подозреваю что надо подменять ещё одну оконную процедуру, но уже системного трея.
                          Прикреплённый файлПрикреплённый файлClock.rar (3,37 Кбайт, скачиваний: 140)
                          Сообщение отредактировано: Nikfel -
                            Разобрался как отлавливать щелчок по часам левой или правой кнопкой мыши. Пришлось подменять оконную процедуру класса TrayClockWClass и обрабатывать сообщение WM_NCHITTEST.
                            Прикреплённый файлПрикреплённый файлClock.rar (3,53 Кбайт, скачиваний: 207)
                              Пожалуй менять надо только одну оконную процедуру часов. Переписал код немного по другому(исправил глюк при загрузке), но теперь не знаю как выгрузить dll из процесса explorer. Пробовал из dll вызывать FreeLibrary(hInstance), но не сработало. При щелчке правой кнопки мыши по часам пытался делать выгрузку dll из процесса, но никак не выходит. В чём тут ошибка? Заранее спасибо.
                              Прикреплённый файлПрикреплённый файлClock.rar (3,59 Кбайт, скачиваний: 132)
                                Скорее всего для выгрузки dll из процесса надо использовать хук, как в hdll.dpr, но вместо загрузки gas.dll делать выгрузку dll, используя GetModuleHandle. Пока нет времени это проверить, но думаю так и надо делать.
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) 1 [2] 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0575 ]   [ 21 queries used ]   [ Generated: 20.05.24, 01:35 GMT ]