На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania 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
  
> Надпись на часах в трее, Решил я подурачиться... ;)
    ExpandedWrap disabled
      uses
        Windows, Messages, Dialogs;
      var
        hTaskbar  : HWND;
        hTrayClock: HWND;
      begin
        hTaskbar := FindWindow('Shell_TrayWnd', nil);
        hTrayClock := FindWindowEx(hTaskbar, 0, 'TrayClockWClass', nil);
        SetWindowText(hTrayClock, '>:-(');
        SendMessage(hTrayClock, WM_MOUSEMOVE, 0, 0);
      end.

    По всем моим подсчётам этот код должен менять надпись на часиках, но видать я где-то просчитался, поскольку этот код на самом деле нифига не меняет. :no:

    Не пойму, в чём причина? :wall:
    Покажем user posted image мировой несправедливости
      Вот так, если я не ошибаюсь... ;)
      ExpandedWrap disabled
        hTaskBar := FindWindow('Shell_TrayWnd', nil);
        hTrayNotify := FindWindowEx(hTaskBar, 0, 'TrayNotifyWnd', nil);
        hTrayClock := FindWindowEx(hTrayNotify, 0, 'TrayClockWClass', nil);
        ...
        volvo877, так действительно правильней (я осознал), но, к сожалению, этот код тоже не даёт желаемого результата. :huh:
        ExpandedWrap disabled
          uses
            Windows, Messages, Dialogs;
          var
            hTaskbar    : HWND;
            hTrayNotify : HWND;
            hTrayClock  : HWND;
          begin
            hTaskBar := FindWindow('Shell_TrayWnd', nil);
            hTrayNotify := FindWindowEx(hTaskBar, 0, 'TrayNotifyWnd', nil);
            hTrayClock := FindWindowEx(hTrayNotify, 0, 'TrayClockWClass', nil);
            SetWindowText(hTrayClock, '>:-(');
            SendMessage(hTrayClock, WM_MOUSEMOVE, 0, 0);
          end.
        Сообщение отредактировано: drinkOut -
        Покажем user posted image мировой несправедливости
          ExpandedWrap disabled
            var
              hTrayClock  : HWND;
              DC:HDC;
              r:TRect;
            begin
              hTrayClock := FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'TrayClockWClass',nil);
              GetWindowRect(hTrayClock,r);
              DC := GetDC(0);
            //  SetBkMode(DC, TRANSPARENT);   // можешь сделать прозрачный фон
              SetTextColor(DC, RGB($0FF,0,0));
              SetBkColor(DC,RGB($0FF,$0FF,0));
              TextOut(DC, r.Left+((r.Right-r.Left) div 4), r.Top+((r.Bottom-r.Top) div 4), '>:-(', 4);
              ReleaseDC(hTrayClock, DC);
            end.

          При следующем обновлении часов надпись исчезнет. Так что можешь это по таймеру делать.
          Кто рано встает, тому целый день спать хочется
            А как свое окошко в трей внедрить?
              Кто рано встает, тому целый день спать хочется
                Ясно :yes:
                Походу дела надпись на часиках - это не текст контрола, а графический вывод, вот и SetWindowText() естесно не подошёл, приходиться самим перерисовывать.
                ExpandedWrap disabled
                  Inc(Krid.Rating);
                Покажем user posted image мировой несправедливости
                  Цитата Krid @

                  Иконку я и так знаю как туда засунуть. А вот как сделать в трее свое окошко, подобное тем же часам???
                    Например так
                    ExpandedWrap disabled
                      uses
                        windows, messages, ShellAPI;
                       
                       
                      const
                       ClassName = 'MyClockWndClass';
                       
                      var
                       hTrayClock,Window:hWnd;
                       idTM:cardinal;
                       
                      function SysDateToStr: string;
                      const
                        sDateFmt = 'dddd, d MMMM yyyy';
                      var
                       ST : TSystemTime;
                      begin
                       GetLocalTime(ST);
                       SetLength(Result, MAX_PATH);
                       GetDateFormat(LOCALE_USER_DEFAULT,0, @ST,pchar(sDateFmt), @Result[1], MAX_PATH);
                      end;
                       
                      function SysTimeToStr:string;
                      const
                         sTimeFmt = 'HH:mm';
                      var
                       ST : TSystemTime;
                      begin
                       GetLocalTime(ST);
                       SetLength(Result,15);
                       GetTimeFormat(LOCALE_USER_DEFAULT,0,@st,sTimeFmt,@Result[1],15);
                      end;
                       
                      procedure TimerProc(wnd:HWND;uMsg,idEvent,dwTime:UINT);stdcall;
                      begin
                       InvalidateRect(wnd,nil,true);
                      end;
                       
                       
                      procedure RecalcWndPos;
                      var
                       r:TRect;
                       X,Y:integer;
                      begin
                       X:=GetSystemMetrics(SM_CXDLGFRAME);
                       Y:=GetSystemMetrics(SM_CYDLGFRAME);
                       GetWindowRect(hTrayClock,r);
                       SetWindowPos(Window,0,r.Left+X,r.Top+Y, r.Right-r.Left,r.Bottom-r.Top-Y,0);
                      end;
                       
                      function AppWndProc(wnd: HWND; uMsg:DWORD; wParam: WPARAM; lParam: LPARAM): Longint; stdcall;
                      var
                        DC      : HDC;
                        ps      :TPaintStruct;
                        pt      :TPoint;
                        r       :TRect;
                        Cmd     : LongBool;
                        hm:HMenu;
                      begin
                        Result := 0;
                      case uMsg of
                       
                       WM_SETTINGCHANGE: if wParam=SPI_SETWORKAREA then RecalcWndPos;
                       WM_PAINT:
                          begin
                           DC:=BeginPaint(wnd,ps);
                           GetClientRect(wnd,r);
                           SetBkMode(DC,TRANSPARENT);
                           SetTextColor(DC,RGB(255,255,0));
                           DrawText(DC,PChar(SysTimeToStr),-1,r,DT_SINGLELINE or DT_CENTER or DT_VCENTER);
                           EndPaint(wnd,ps);
                           exit;
                          end;
                       WM_RBUTTONDOWN:
                        begin
                         hm:=CreatePopupMenu;
                         pt.X:=LOWORD(lParam);
                         pt.Y:=HIWORD(lParam);
                         ClientToScreen(wnd,pt);
                         Insertmenu(hm,0,MF_BYPOSITION or MF_STRING,$101,'Exit');
                         Insertmenu(hm,0,MF_BYPOSITION or MF_SEPARATOR,0,nil);
                         Insertmenu(hm,0,MF_BYPOSITION or MF_STRING,$102,'Date/Time Settings');
                         Insertmenu(hm,0,MF_BYPOSITION or MF_SEPARATOR,0,nil);
                         Insertmenu(hm,0,MF_BYPOSITION or MF_STRING,dword(-1),PChar(SysDateToStr));
                         SetMenuDefaultItem(hm,0,1);
                         Cmd:=TrackPopupMenu(hM,TPM_LEFTALIGN or TPM_RIGHTBUTTON or
                                        TPM_RETURNCMD,pt.X,pt.Y,0,Window,nil);
                          case longint(Cmd) of
                          $101: SendMessage(wnd,wm_destroy,0,0);
                          $102: ShellExecute(0,nil,'control.exe','date/time',nil,SW_SHOW);
                          end;
                         DestroyMenu(hm);
                        end;
                       WM_DESTROY:
                           begin
                            PostQuitMessage(wparam);
                            KillTimer(wnd,idTM);
                           end
                        end;
                      Result := DefWindowProc(wnd, uMsg, wParam, lParam);
                      end;
                       
                      procedure InitInstance;
                      var
                        AppWinClass: TWndClass;
                      begin
                      with AppWinClass do
                      begin
                          style:= CS_VREDRAW or CS_HREDRAW;
                          lpfnWndProc:= @AppWndProc;
                          cbClsExtra:= 0;
                          cbWndExtra:= 0;
                          hInstance:= hInstance;
                          hIcon:= LoadIcon(0,IDI_APPLICATION);
                          hCursor:= LoadCursor(0,IDC_ARROW);
                          hbrBackground:= GetStockObject(BLACK_BRUSH);
                          lpszMenuName:= nil;
                          lpszClassName:= ClassName;
                      end;
                      if RegisterClass(AppWinClass)=0 then Halt(1)
                      end;
                       
                      procedure InitApplication;
                      begin
                       hTrayClock:=FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'TrayClockWClass',nil);
                       Window := CreateWindow(ClassName,nil, WS_POPUP or WS_DLGFRAME, 0,0,0,0, hTrayClock,0,HInstance,nil);
                       If Window=0 then halt(1);
                       RecalcWndPos;
                      end;
                       
                      procedure InitWindow;
                      begin
                       idTM:=SetTimer(Window,1,1000,@TimerProc);
                       ShowWindow(Window, SW_SHOWNORMAL);
                       UpdateWindow(Window);
                       InvalidateRect(Window,nil,True)
                      end;
                       
                      procedure MsgLoop;
                      var
                       Message:TMsg;
                      begin
                       while GetMessage(Message, 0, 0, 0) do
                          begin
                            TranslateMessage(Message);
                            DispatchMessage(Message);
                          end;
                        Halt(Message.wParam)
                      end;
                       
                      begin
                       InitInstance;
                       InitApplication;
                       InitWindow;
                       MsgLoop
                      end.

                    exe в аттаче.
                    Прикреплённый файлПрикреплённый файлp1.zip (8.76 Кбайт, скачиваний: 24)
                    Кто рано встает, тому целый день спать хочется
                      Браво,Krid! :)
                      Покажем user posted image мировой несправедливости
                        Внимание, прикол!
                        У меня Agnitum Tauscan посчитал эту прогу трояном! :wacko:
                        Прикреплённый файлПрикреплённый файлTau.JPG (15.71 Кбайт, скачиваний: 390)
                        Покажем user posted image мировой несправедливости
                          Скорее всего из-за
                          ExpandedWrap disabled
                            FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'TrayClockWClass',nil);

                          вроде все остальное безобидно.
                          Кто рано встает, тому целый день спать хочется
                            Krid, :no:
                            FindWindowEx(...) тут не причём - я только что проверил.
                            Покажем user posted image мировой несправедливости
                              Хм... / говоря в сторону / а я бы сделал в соответствии с MSDN и реализовал бы свой интерфейс на основе IDescBand ;)
                              user posted image
                              В русском языке есть слова, их там много.
                              Когда их составляешь вместе, получается предложение, где есть сказуемое, подлежащее и прочая светотень.
                              В нём переставь местоимение, сказуемое и подлежащее, и появится интонация!
                                Цитата drinkOut @
                                FindWindowEx(...) тут не причём - я только что проверил.

                                Понятно. Я просто подумал, что ему не понравилась именно попытка найти окно TrayClockWClass. Вобщем, выкинь ты этот Tauscan :)

                                Цитата Rouse_ @
                                а я бы сделал в соответствии с MSDN и реализовал бы свой интерфейс на основе IDescBand ;)

                                Да, но это если бы надо было встроить свою панельку в таскбар. А для встраивания окон в трей, увы, интерфейсов не сделали. Так что тут все по-старинке :)

                                Кстати, более удобный вариант заменить часы в трее - внедриться в explorer и сделать сабклассинг TrayClockWClass.
                                Кто рано встает, тому целый день спать хочется
                                  Цитата Krid @
                                  сделать сабклассинг TrayClockWClass

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

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

                                      Сообщения были разделены в тему "Проблемы с треем"
                                      Покажем user posted image мировой несправедливости
                                        вот тоже захотелось часики перерисовать... и вот проблема в том, что хочется оставить фон от темы, т.е. запретить 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 Кбайт, скачиваний: 86)
                                                    Сообщение отредактировано: Nikfel -
                                                      Цитата Nikfel @
                                                      Код нуждается в тщательной доработке

                                                      Есессно :yes: Код писАлся под XP.
                                                      Твой код пока не смотрел. Если он работает во всех NT-осях (начиная с XP) - прямая ему дорога в ФАК :yes:
                                                      Кто рано встает, тому целый день спать хочется
                                                        Вот переделал код по другому, но есть много не решённых вопросов:
                                                        После появления часов в трее ширина часов не меняется, пришлось писать свою процедуру для изменения ширины часов только после загрузки часов. Причём пришлось использовать showwindow для скрытия окна трея и показа его, иначе глюки с графикой(invalidaterect не помогала). Код нуждается в доработке. В коде я учитывал ширину TrayShowDesktopButtonWClass как равную 15, а в XP такого компонента нет, поэтому лучше бы получать ширину этого объекта через GetClientRect.
                                                        Ещё так и не разобрался как отловить щелчок левой или правой кнопкой мыши по часам в трее? Хотя подозреваю что надо подменять ещё одну оконную процедуру, но уже системного трея.
                                                        Прикреплённый файлПрикреплённый файлClock.rar (3,37 Кбайт, скачиваний: 74)
                                                        Сообщение отредактировано: Nikfel -
                                                          Разобрался как отлавливать щелчок по часам левой или правой кнопкой мыши. Пришлось подменять оконную процедуру класса TrayClockWClass и обрабатывать сообщение WM_NCHITTEST.
                                                          Прикреплённый файлПрикреплённый файлClock.rar (3,53 Кбайт, скачиваний: 146)
                                                            Пожалуй менять надо только одну оконную процедуру часов. Переписал код немного по другому(исправил глюк при загрузке), но теперь не знаю как выгрузить dll из процесса explorer. Пробовал из dll вызывать FreeLibrary(hInstance), но не сработало. При щелчке правой кнопки мыши по часам пытался делать выгрузку dll из процесса, но никак не выходит. В чём тут ошибка? Заранее спасибо.
                                                            Прикреплённый файлПрикреплённый файлClock.rar (3,59 Кбайт, скачиваний: 57)
                                                              Скорее всего для выгрузки dll из процесса надо использовать хук, как в hdll.dpr, но вместо загрузки gas.dll делать выгрузку dll, используя GetModuleHandle. Пока нет времени это проверить, но думаю так и надо делать.
                                                                Переписал код по другому. Сейчас стал использовать 1 exe файл и 1 dll файл. При завершении exe dll тоже выгружается из процесса, даже не использовал LoadLibrary. Исправил процедуру updateSize, т.к. исчезало окно выбора языка при запуске программы. Для выхода из программы щёлкаем правой кнопкой по часам в трее и появится окно из exe файла в нём щелкаем выход и должно выходить нормально. Тестировал пока только в Windows 7. Вот есть программа Clock Tray Skins для замены часов в трее, она похоже использует кок раз такой подход, как я написал, но в добавок она создаёт окно под окном часов с чёрным фоном, чтобы часы было лучше видеть.
                                                                Прикреплённый файлПрикреплённый файлClock.RAR (7,9 Кбайт, скачиваний: 65)
                                                                  Этот код не во всех системах Windows 7 будет работать, надо подменять не только оконную процедуру часов, но и у компонента TrayNotifyWnd. В следующие выходные думаю допишу как-надо и протестирую на других компах с Windows 7.
                                                                    Переписал код по другому. Сейчас опять вернулся к тому что подгружаю dll через LoadLibrary и выключаю хук, если этого не делать то dll будет болтаться в других процессах тоже. Но проблема остаётся в выгрузке dll из процесса, т.к. выгрузка не всегда происходит(можно наверно использовать отдельную dll именно для выгрузки dll по такому принципу как загрузка, т.к. в одной dll пришлось использовать хук для загрузки WH_CALLWNDPROC, а для выгрузки WH_GETMESSAGE). В XP не правильно работает процедура updateSize - надо её переписать. Но в целом код работает только бывают небольшие проблемы.
                                                                    Прикреплённый файлПрикреплённый файлClock.RAR (9,96 Кбайт, скачиваний: 66)
                                                                      Переписал код как раньше. Использую теперь exe для загрузки dll и выгрузки. Всего 1 exe и 3 dll. Код работает в Windows 7 и Windows XP. Загружается и выгружается без проблем, но в Windows 7 нужны права Администратора, без них не будет запускаться.

                                                                      Недостаток:

                                                                      Если панель задач расположить вертикально то часы не отображаются, думаю это легко можно исправить, изменив процедуру UpdateSize(вместо left задавать top). Не во всех системах Windows 7 запускается программа, подозреваю что может блокировать брандмауэр или просто надо ставить какие-то привилегии, если учетная запись не администратор.
                                                                      Прикреплённый файлПрикреплённый файлClock.rar (9,77 Кбайт, скачиваний: 92)
                                                                      Сообщение отредактировано: Nikfel -
                                                                        Nikfel, мой тебе совет - не выкладывай свои промежуточные решения.
                                                                        Доведи прогу до ума, сделай её такой, какой ты её хочешь видеть. И уже тогда выкладывай код.
                                                                        Обсуждать тут буквально каждый твой шаг никому особо не интересно. Интересен конечный результат - готовый проект. На него обратит внимание гораздо больше народу, чем сейчас. Соответс-но, всякие там ошибки/проблемы/недочёты/etc. будут быстрее исправляться. Отсюда - и код будет лучше, и проект будет быстрее развиваться (если ты, конечно, именно какой-то свой проект делаешь).

                                                                        ЗЫ а по большому счёту - никому это нафиг не нужно :no: Просто когда-то я написАл эту прогу для XP после какого-то ДР, с жуткой похмелюги, чисто на спор (в том состоянии мне казалось это прикольным).
                                                                        Ну а сейчас я думаю, что ты зря тратишь время, которое мог бы потратить его на что-то более полезное..

                                                                        ЗЫЗЫ хотя, конечно, дело твоё. Просто программ, заменяющих часы в трее очень много. Зачем изобретать очередной лисопед? Или у тебя есть какие-то оригинальные решения? Тогда welcome! ;)
                                                                        Кто рано встает, тому целый день спать хочется
                                                                          Цитата aster_x @
                                                                          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);

                                                                          а как раздвинуть (сделать больше) по ширине панель?

                                                                          у меня не влазит, сделал таким макаром
                                                                          ExpandedWrap disabled
                                                                              TextOut(DC, r.Left-20, r.Top, Pchar(cdr), length(cdr));
                                                                              TextOut(DC2, r.Left-20, r.Top+16, Pchar(day), length(day));
                                                                              TextOut(DC3, r.Left-20, r.Top+32, Pchar(date), length(date));

                                                                          но при таком варианте часы "вылазят" на соседний значек...
                                                                          Сообщение отредактировано: Spirit -
                                                                            Цитата Spirit @
                                                                            а как раздвинуть (сделать больше) по ширине панель?

                                                                            Какую панель? Вообще ничего раздвигать не нужно. Просто указываешь нужный размер в CreateWindow/SetWindowPos/etc.
                                                                            Кто рано встает, тому целый день спать хочется
                                                                            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                            0 пользователей:


                                                                            Рейтинг@Mail.ru
                                                                            [ Script Execution time: 0,2492 ]   [ 29 queries used ]   [ Generated: 21.11.19, 05:13 GMT ]