![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Замена системных часов
FinDelDev © (2002-04-26 11:59:00)Уважаемые мастера Delphi, пожалуйста подскажите как вместо обычных часов на SysTray поставить свои. У меня получилось добавить их в автозагрузку и расположить около SysTray, а большего, увы, я не смог. Огромное спасибо всем, кто откликнется на мой вопрос, очень жду ответа.
Небольшое пояснение: в Delphi начал работать совсем недавно, и на Вашем форуме впервые, поэтому извините если вопрос задан некорректно.
cok (2002-04-28 13:50:00) [1]Чёто вы загнались
Вставь в свои часы (это убирает виндовые часы, точнее закрывает):
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;
Cobalt (2002-04-27 21:49:00) [2]У меня есть одна такая прога (не моя) - 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.
Nikolay (2002-04-27 18:27:00) [3]нет ппросто сунуть нельзя... обновление идет каждую секунду...
и твои часы будут стираться. :(
PavelOKES (2002-04-27 10:04:00) [4]А мож просто перекрыть цифири часов Explorera своими? Тогда вопрос встает так - как сунуть часы в systray на место стандартных?
Cobalt (2002-04-27 08:26:00) [5]Хорошая идея, я как-то не подумал о таком ходе. Мне казалось, что должен быть какой-то стандартный интерфейс "для замены".
Только зачем же отключать и создавать заново? Может лучше менять точку входа в оконную функцию, которая будет отрисовывать изображение?
Almaz (2002-04-27 00:37:00) [6]
> FinDelDev ©
Это довольно проблематично, но решаемо - необходимо внедряться в адресное пространство explorer"a и создавать окно часов уже оттуда, предварительно отключив стандартные.
Удачи.
Cobalt (2002-04-26 19:50:00) [7]Попробуй поискать в MSDN на ключевое слово TrayClockWClass
http://msdn.microsoft.com/library/default.asp