Форум: "Система";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];
ВнизЗамена системных часов Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.006 c