Trayclockwclass not found как исправить

← →SHS   (2004-02-05 09:18) [0]

 
SHS
 
(2004-02-05 09:18)
[0]

Как вывести в TrayClock (TrayClockWClass) время в своём формате,
например с секундами? Проверяю программой Microsoft Spy++, в
Caption часов действительно содержаться мои данные, но в панели
не отображаются. Вот мой код:

var
hTaskbar, hTray, hClock: HWND;

procedure TForm1.FormCreate(Sender: TObject);
begin
hTaskbar := FindWindowEx(0, 0, «Shell_TrayWnd», nil);
hTray := FindWindowEx(hTaskbar, 0, «TrayNotifyWnd», nil);
hClock := FindWindowEx(hTray, 0, «TrayClockWClass», nil);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
SetWindowTextA(hClock, TimeToStr(Now));
UpdateWindow(hClock);
end;


 
dr Tr0jan ©
 
(2004-02-05 15:04)
[1]

Попробуй убрать UpdateWindow, попробуй поставить период таймера 100 мс, попробуй все делать в отдельном потоке.
Такде можешь попробовать компонент TCoolTrayIcon, ИМХО, вышла уже 1.4 или больше, а может и 1.44, попробуй поищи!
А может быть дело даже в том, что часы в трее, это не текст а картика, а уж текст часов хранится как-раз для генерации картинки. Попробуй рисовать текст на канвасе часов.


 
DVM ©
 
(2004-02-05 18:07)
[2]


> в
> Caption часов действительно содержаться мои данные, но в
> панели
> не отображаются. Вот мой код:

А кто сказал, что заголовок окна обязательно совпадает с текстом нарисованным на поверхности окна? Часы рисуют новое время раз в минуту (таймер имеет шаг минуту) или по WM_PAINT.


 
SHS
 
(2004-02-06 15:43)
[3]

Сразу хочу поблагодарить за советы, спасибо!

Хочу ещё уточнить, значит я сам должен отрисовывать время? В правильном направлении иду с таким кодом или можно как-то эффективнее и красивее это сделать?

var
hTaskbar, hTray, hClock: HWND;
hCanvas: TCanvas;

procedure TForm1.FormCreate(Sender: TObject);
begin
hTaskbar := FindWindowEx(0, 0, «Shell_TrayWnd», nil);
hTray := FindWindowEx(hTaskbar, 0, «TrayNotifyWnd», nil);
hClock := FindWindowEx(hTray, 0, «TrayClockWClass», nil);

hCanvas := TCanvas.Create;
hCanvas.Handle := GetDC(hClock);
hCanvas.Brush.Style := bsClear;
hCanvas.Font.Color := clRed;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
hCanvas.TextOut(0, 10, TimeToStr(Now) );
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
ReleaseDC(hClock, hCanvas.Handle);
hCanvas.Free;
end;


 
DVM ©
 
(2004-02-06 19:04)
[4]


> В правильном направлении иду с таким кодом или можно как-то
> эффективнее и красивее это сделать?

Эффективнее, это использовать только функции GDI. Но это не тот случай, где будет ощутима разница.
Направление вроде правильное.



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

Поиск:

Ответ в темуСоздание новой темы
Создание опроса
> Подмена системных часов в трее, отображать в трее например еще и погоду 

:(

   

Опции темы

AntonChik
Дата 20.2.2006, 08:56 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.10.2005
Где: Красноярск

Репутация: 1
Всего: 1

Здравствуйте,
мне надо, чтобы рядом в трее рядом с системным временем писалась, например, температура воздуха за бортом…
Размеров новой иконки (TTrayIcon) в трее для этого не хватит (опять же вопрос : Может как-то можно увеличить ширину иконки? )…использовать несколько таких иконок мне кажется неудобным,но в первую очередь я не уверен, что они всегда будут стоять в один ряд и в нужном порядке (а может это возможно???)
Вобщем,был я здесь
и вот до чего дошел:
1.Скрываем окно(или панель,не знаю как правильно сказать) с виндовыми часами

Код

HWND hWnd;
hWnd = FindWindow("Shell_TrayWnd", NULL);
hWnd = FindWindowEx(hWnd, NULL, "TrayNotifyWnd", NULL);
hWnd = FindWindowEx(hWnd, NULL, "TrayClockWClass", NULL);
ShowWindow(hWnd, SW_HIDE); 

2.далее готовим свою форму с часами и погодой

Код

Form2->BorderStyle=bsNone;// или какой?
RECT *r=new RECT;
GetWindowRect(hWnd,r);
Form2->Width=r->right-r->left;
Form2->Height=r->bottom-r->top;
Form2->Label2->Caption="12:04 -12.4C";

ну или тип того…
3.Теперь как-то надо подсунуть Form2 в трей на место системных часов (TrayClockWClass)…
либо не скрывать часы, а засунуть Form2 в TrayNotifyWnd…

Не знаю как правильно использовать для этого SetParent,Parent,ParentWindows и прочее…
Получаются какие-то несостыковочки, хотя бы с количеством параметров SetParent…

Помогите,пожалуйста…

———————

«Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги 

PM MAIL   Вверх
Artemon
Дата 20.2.2006, 11:46 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

а ты мне нравишься
***

Профиль
Группа: Завсегдатай
Сообщений: 1771
Регистрация: 24.2.2004
Где: Челябинск

Репутация: 7
Всего: 20

Решение намного проще.

1) Получи Handle часов (что ты и сделал)
2) Создай таймер и аомести в него ф-ию TextOut, которая будет выводить твой текст.

P.S.
Не забудь поставить прозрачность фона у текста

———————

Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru

PM MAIL   Вверх
Romikgy
Дата 20.2.2006, 12:33 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146

Код

SetParent(Form2->Handle,FindWindowEx(FindWindow("Shell_TrayWnd", NULL), NULL, "TrayNotifyWnd", NULL));

Добавлено @ 12:35
Имхо

Цитата(AntonChik @ 20.2.2006, 07:56 Найти цитируемый пост)
GetWindowRect(hWnd,r);

это лучше взять у

Цитата(AntonChik @ 20.2.2006, 07:56 Найти цитируемый пост)
hWnd = FindWindowEx(hWnd, NULL, «TrayClockWClass», NULL);

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
AntonChik
Дата 21.2.2006, 06:12 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.10.2005
Где: Красноярск

Репутация: 1
Всего: 1

2Artemon: Спасибо за TextOut…Только вот хотел спросить, насколько это будет, так сказать, оправданно, ведь придется обновлять текст довольно-таки часто (я думаю каждые 2-5 сек),т.к. каждую минуту обновляется время, да и панелька на месте не стоит (если включен autohide)…а ведь, вообще, погоду можно обновлять и раз в 10 мин…
Впридачу может расскажешь как закинуть картинку на чужую форму,точнее как для этого правильно заюзать Draw ?

2Romikgy: и на твою строку с SetParent пишется опять же Cannot convert void* to TWinControl * smile

Это сообщение отредактировал(а) AntonChik — 21.2.2006, 06:22

———————

«Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги 

PM MAIL   Вверх
Romikgy
Дата 21.2.2006, 10:29 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146

Цитата(AntonChik @ 21.2.2006, 05:12 Найти цитируемый пост)
я думаю каждые 2-5 сек

Имхо каждую секунду smile

Цитата(AntonChik @ 21.2.2006, 05:12 Найти цитируемый пост)
и на твою строку с SetParent пишется опять же Cannot convert void* to TWinControl *

Чет какая то непонятка

Код

The SetParent function changes the parent window of the specified child window. 

HWND SetParent(

    HWND hWndChild,    // handle of window whose parent is changing
    HWND hWndNewParent    // handle of new parent window
   );    

Это прототип, где здесь void*???
Так попробуй.

Код

SetParent((HWND)Form2->Handle,FindWindowEx(FindWindow("Shell_TrayWnd", NULL), NULL, "TrayNotifyWnd", NULL));

Добавлено @ 10:37
smile Мож сделать так

Код

Form2->Caption="Lichno_moya_podpis";
SetParent(FindWindow(NULL, "Lichno_moya_podpis"),FindWindowEx(FindWindow("Shell_TrayWnd", NULL), NULL, "TrayNotifyWnd", NULL));

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
AntonChik
Дата 21.2.2006, 11:39 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.10.2005
Где: Красноярск

Репутация: 1
Всего: 1

боюсь тут дело в перегрузке функции

Код

virtual void __fastcall SetParent(TWinControl* AParent);

как с этим справиться???

———————

«Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги 

PM MAIL   Вверх
Romikgy
Дата 21.2.2006, 11:42 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146

дык это чейто метод!
попробуй так

Код

System::SetParent(...);

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
AntonChik
Дата 21.2.2006, 14:00 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.10.2005
Где: Красноярск

Репутация: 1
Всего: 1

увы, ‘SetParent’ is not a member of ‘System’ smile

Это сообщение отредактировал(а) AntonChik — 21.2.2006, 14:00

———————

«Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги 

PM MAIL   Вверх
_hunter
Дата 21.2.2006, 14:14 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Эксперт
****

Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 24
Всего: 98

ну напиши просто someControl->Parent = someOtherControl;

———————

Tempora mutantur, et nos mutamur in illis…

PM ICQ   Вверх
Romikgy
Дата 21.2.2006, 15:51 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146

Код

#include <winuser.h>

есть?

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
AntonChik
Дата 22.2.2006, 08:59 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.10.2005
Где: Красноярск

Репутация: 1
Всего: 1

2Romikgy: подключаю winuser.h ,но не помогает…

2_hunter: Form2->Parent=(TWinControl*)hWnd компиляется, но при обращении выкидывает AccessViolation…

и все-таки как быть с перегрузкой SetParent..???

———————

«Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги 

PM MAIL   Вверх
Romikgy
Дата 22.2.2006, 09:55 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146

AntonChik, создай отдельную ф-цию, вне объявлений класса Form2, и вызови там

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх
AntonChik
Дата 22.2.2006, 13:29 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Бывалый
*

Профиль
Группа: Участник
Сообщений: 207
Регистрация: 4.10.2005
Где: Красноярск

Репутация: 1
Всего: 1

спасибо. да, были такие мысли… конечно же работает (в смысле нет перегрузки и все такое)…но, вцелом, вся эта замутка с подменой часов — пустая затея…
надо делать по уму — создавать свой DeskBand Object( как мне посоветовали на другом форуме) и не париться …
по этому поводу наверно надо открывать новую тему smile

Это сообщение отредактировал(а) AntonChik — 22.2.2006, 13:31

———————

«Человек притаился за деревом. За широким огромным деревом. Он выглядывал тихонько и прятался. Но его никто не преследовал.» (с) Хорги 

PM MAIL   Вверх
Romikgy
Дата 22.2.2006, 15:06 (ссылка)
| (нет голосов)
Загрузка ... Загрузка …




Быстрая цитата

Цитата

Любитель-программер
****

Профиль
Группа: Участник Клуба
Сообщений: 7325
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 11
Всего: 146

Цитата(AntonChik @ 22.2.2006, 12:29 Найти цитируемый пост)
наверно надо открывать новую тему

Да , новую тему

Цитата(AntonChik @ 22.2.2006, 12:29 Найти цитируемый пост)
DeskBand Object

А че это?

———————

Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности.

smile

PM   Вверх



















Ответ в темуСоздание новой темы
Создание опроса
Правила форума «С++ Builder»
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) — крупнейший в рунете сборник материалов по Дельфи

  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 

0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »

    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.

Понравилась статья? Поделить с друзьями:
  • Transfer belt error
  • Trailer air reservoir low ошибка iveco stralis
  • Tpm error outlook
  • Tpkd sys синий экран как исправить
  • Tpkd sys ошибка