Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.18;
Скачать: CL | DM;

Вниз

Замена системных часов   Найти похожие ветки 

 
FinDelDev ©   (2002-04-26 11:59) [0]

Уважаемые мастера Delphi, пожалуйста подскажите как вместо обычных часов на SysTray поставить свои. У меня получилось добавить их в автозагрузку и расположить около SysTray, а большего, увы, я не смог. Огромное спасибо всем, кто откликнется на мой вопрос, очень жду ответа.

Небольшое пояснение: в Delphi начал работать совсем недавно, и на Вашем форуме впервые, поэтому извините если вопрос задан некорректно.


 
Cobalt ©   (2002-04-26 19:50) [1]

Попробуй поискать в MSDN на ключевое слово TrayClockWClass
http://msdn.microsoft.com/library/default.asp


 
Almaz ©   (2002-04-27 00:37) [2]


> FinDelDev ©

Это довольно проблематично, но решаемо - необходимо внедряться в адресное пространство explorer"a и создавать окно часов уже оттуда, предварительно отключив стандартные.

Удачи.


 
Cobalt ©   (2002-04-27 08:26) [3]

Хорошая идея, я как-то не подумал о таком ходе. Мне казалось, что должен быть какой-то стандартный интерфейс "для замены".

Только зачем же отключать и создавать заново? Может лучше менять точку входа в оконную функцию, которая будет отрисовывать изображение?


 
PavelOKES   (2002-04-27 10:04) [4]

А мож просто перекрыть цифири часов Explorera своими? Тогда вопрос встает так - как сунуть часы в systray на место стандартных?


 
Nikolay ©   (2002-04-27 18:27) [5]

нет ппросто сунуть нельзя... обновление идет каждую секунду...
и твои часы будут стираться. :(


 
Cobalt ©   (2002-04-27 21:49) [6]

У меня есть одна такая прога (не моя) - TClockEx - позволяет задавать форматирование времени и даты по собственному желанию (формат типа "d MMM HH:mm:ss"), а также показывает текущую загрузку памяти и процессора!
На сколько я понял, она именно внедряет ДЛЛ-ку в Эксплорер и заменяет функцию его окна. (Проверено с помощью Visual Studio"s SpyXX).
Насчет внедрения - подробно:
1) находишь хэндл окна класса TrayClockWClass(см. FindWindow)
2)находишь поток (thread), которому принадлежит это окно (см. GetWindowThreadProcessId)
3)Ставишь хук на этот поток (см. ФАК и Win32 Programm Reference (в миру - Win32.hlp)), соответственно, нужна ДЛЛ-ка (из экзешника почему-то ну не ставится хук, хоть плачь;((()
4) посылаешь этому окну сообщение типа WM_NULL
5) сообщение перехватывается твоим хуком, устанавливаешь свою функцию для окна (есть идея дополнительно проверять класс окна, или искать заново, а то еще установишь не тому окну ;))))(см. SetWindowLong)
Да, кстати, не забудь загрузить свою ДЛЛ-ку( LoadLibrary)ещё раз, а то после снятия хука она ведь будет один раз выгружена из Проводника.
6) убираешь хук (идея - посылаешь из хука сообщение своему окну, по которому оно снимает хук)

-------- Вот, в принципе, и все.--------------
Можно выгружать свою прогу (если она не нужна - все ведь делается из ДЛЛ-ки, т.е. отрисовка окна, да и если пользователь убьет прогу, то ДЛЛ-ка будет работать до перезагрузки)

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

С уважением, Cobalt.


 
cok ©   (2002-04-28 13:50) [7]

Чёто вы загнались
Вставь в свои часы (это убирает виндовые часы, точнее закрывает):

procedure TForm1.FormCreate(Sender: TObject);
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);
height:=1;
width:=1;
end;



Страницы: 1 вся ветка

Текущий архив: 2002.07.18;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.015 c
14-58276
Igor_thief
2002-06-20 14:47
2002.07.18
Скины


3-57992
koty
2002-06-27 01:51
2002.07.18
OLAP-Данные.


1-58145
Plt
2002-07-04 10:26
2002.07.18
Word


3-57984
ivts
2002-06-26 20:02
2002.07.18
TQuery


14-58323
jjjkkklll
2002-06-18 08:28
2002.07.18
VCL