Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.116.89.81] |
|
Страницы: (3) 1 [2] 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Не понял... Т.е. создать окно с таким же названием класса? ЗЫ - Пойду update для Tauscan'а скачаю |
Сообщ.
#17
,
|
|
|
Сабклассинг - это когда твоя программа перехватывает на себя все мессаги от некого окна.
Суперклассинг - это создание нового класса окна на базе уже существующего класса. При этом имя нового класса должно быть другим. Жаль, что Цитата для встраивания окон в трей, увы, интерфейсов не сделали. Так что тут все по-старинке |
Сообщ.
#18
,
|
|
|
Сообщ.
#19
,
|
|
|
вот тоже захотелось часики перерисовать... и вот проблема в том, что хочется оставить фон от темы, т.е. запретить explorer туда рисовать... как это наиболее красиво сделать? почитал про sublassing, на своем тестовом контроле вроде все получается, а при попытки внедриться ничего не происходит... (
|
Сообщ.
#20
,
|
|
|
А как внедряешься и что именно не получается?
|
Сообщ.
#21
,
|
|
|
Alex Forth
Может быть вот так... 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,//Дескриптор окна куду будет вставленна окошко после позиционирования //Но я лично не очень сильно верю. Хотя ... ты можешь проверить сам. r.Left,r.Top,r.Right,r.Bottom, SWP_SHOWWINDOW); |
Сообщ.
#22
,
|
|
|
Цитата aster_x @ Может быть вот так... А внедриться в процесс Explorer'а не забыл? Да и что-то сабклассинга TrayClockWClass не видать.. |
Сообщ.
#23
,
|
|
|
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; |
Сообщ.
#24
,
|
|
|
Вот в интернете нашёл: http://www.xakep.ru/post/19333/default.asp
Но почему-то замена часов в windows 7 не работает, а в XP работает. Почему так? |
Сообщ.
#25
,
|
|
|
Разобрался, хотя не полностью, но вроде оконная процедура часов меняется в windows 7. Код нуждается в тщательной доработке. Но пока такой вариант. Если можно сделать проще то подскажите как?
Прикреплённый файлClock.rar (2,15 Кбайт, скачиваний: 162) |
Сообщ.
#26
,
|
|
|
Цитата Nikfel @ Код нуждается в тщательной доработке Есессно Код писАлся под XP. Твой код пока не смотрел. Если он работает во всех NT-осях (начиная с XP) - прямая ему дорога в ФАК |
Сообщ.
#27
,
|
|
|
Вот переделал код по другому, но есть много не решённых вопросов:
После появления часов в трее ширина часов не меняется, пришлось писать свою процедуру для изменения ширины часов только после загрузки часов. Причём пришлось использовать showwindow для скрытия окна трея и показа его, иначе глюки с графикой(invalidaterect не помогала). Код нуждается в доработке. В коде я учитывал ширину TrayShowDesktopButtonWClass как равную 15, а в XP такого компонента нет, поэтому лучше бы получать ширину этого объекта через GetClientRect. Ещё так и не разобрался как отловить щелчок левой или правой кнопкой мыши по часам в трее? Хотя подозреваю что надо подменять ещё одну оконную процедуру, но уже системного трея. Прикреплённый файлClock.rar (3,37 Кбайт, скачиваний: 140) |
Сообщ.
#28
,
|
|
|
Разобрался как отлавливать щелчок по часам левой или правой кнопкой мыши. Пришлось подменять оконную процедуру класса TrayClockWClass и обрабатывать сообщение WM_NCHITTEST.
Прикреплённый файлClock.rar (3,53 Кбайт, скачиваний: 207) |
Сообщ.
#29
,
|
|
|
Пожалуй менять надо только одну оконную процедуру часов. Переписал код немного по другому(исправил глюк при загрузке), но теперь не знаю как выгрузить dll из процесса explorer. Пробовал из dll вызывать FreeLibrary(hInstance), но не сработало. При щелчке правой кнопки мыши по часам пытался делать выгрузку dll из процесса, но никак не выходит. В чём тут ошибка? Заранее спасибо.
Прикреплённый файлClock.rar (3,59 Кбайт, скачиваний: 132) |
Сообщ.
#30
,
|
|
|
Скорее всего для выгрузки dll из процесса надо использовать хук, как в hdll.dpr, но вместо загрузки gas.dll делать выгрузку dll, используя GetModuleHandle. Пока нет времени это проверить, но думаю так и надо делать.
|