На главную Наши проекты:
Журнал   ·   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  все  ( Перейти к последнему сообщению )  
> Надпись на часах в трее , Решил я подурачиться... ;)
    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:
      Вот так, если я не ошибаюсь... ;)
      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 -
          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);
                  Цитата 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! :)
                        Внимание, прикол!
                        У меня Agnitum Tauscan посчитал эту прогу трояном! :wacko:
                        Прикреплённый файлПрикреплённый файлTau.JPG (15.71 Кбайт, скачиваний: 523)
                          Скорее всего из-за
                          ExpandedWrap disabled
                            FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd',nil),0,'TrayNotifyWnd',nil),0,'TrayClockWClass',nil);

                          вроде все остальное безобидно.
                            Krid, :no:
                            FindWindowEx(...) тут не причём - я только что проверил.
                              Хм... / говоря в сторону / а я бы сделал в соответствии с MSDN и реализовал бы свой интерфейс на основе IDescBand ;)
                                Цитата drinkOut @
                                FindWindowEx(...) тут не причём - я только что проверил.

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

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

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

                                Кстати, более удобный вариант заменить часы в трее - внедриться в explorer и сделать сабклассинг TrayClockWClass.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (3) [1] 2 3  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0574 ]   [ 16 queries used ]   [ Generated: 27.04.24, 05:35 GMT ]