Главная страница
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.01 c
14-58319
Song
2002-06-22 14:42
2002.07.18
Прикол :)


3-57956
dimanew
2002-06-26 08:22
2002.07.18
Пытаюсь изменить тип поля с интеджер на нумерик


3-57990
nitro313
2002-06-26 05:03
2002.07.18
Как организовать поиск в таблице table1 по принципу...


1-58049
Merry
2002-07-01 15:26
2002.07.18
Цвет текста в DBRich


3-57948
Teas
2002-06-25 23:27
2002.07.18
Помогите пожалуйста начинающему