PDA

Ver la Versión Completa : Hint del reloj de Windows


ixMike
02-03-2008, 21:24:53
Hola :)

ufh... cuánto tiempo sin hacer una pregunta por aquí... allá va...

Me gustaría saber cuándo se muestra el hint del reloj de windows, para poder cambiar este texto antes de que se muestre.

:eek:


Salu2 ;)


P.D.: El motivo de querer hacer esto sois muchos de vosotros :rolleyes::p

Edito: hasta ahora lo único que llevo es obtener el Handle del reloj:

hReloj:=FindWindowEx(FindWindowEx(FindWindow('Shell_TrayWnd', nil),
HWND(0), 'TrayNotifyWnd', nil),
HWND(0), 'TrayClockWClass', nil);


Pero no sé hacer nada más :(

ArdiIIa
03-03-2008, 02:27:08
jeje...
Me parece que el asunto tiene mas miga del que parece. :mad:

En principio a mi se me ocurrió hacer un SetWindowLong interfiriendo en proceso Wnd de la ventana del reloj, interceptar los mensajes y ya está.
Fácil verdad ?

Pues mira por donde la cosa parece algo mas compleja...

En principio parece inviable lo que proponía a pelo, a no ser que se meta un gancho o Hook a la aplicación que queremos interferir, y para esto tal como he podido ver, se necesita un DLL para enganchar al relojito.

Buscando y buscando he encontrado en Delphi-PRAXIS (http://www.delphipraxis.net/) el código que te pongo aquí (para que no se pierda) que en realidad es el inicio de lo que necesitas. En este ejemplo se controla únicamente si se pulsa el ratón y saca un mensaje. En tu WndProc deberías controlar creo el WM_MOUSEMOVE y actuar en consecuencia.....................:eek: que creo que no va a ser poniendo y texto sin mas....


El código:


library ClockHook;

var
g_hhook: THandle;
hwndTaskbar, hwndTray, g_hwndClock: hwnd;
idThread: dword;

g_bInitClock: boolean = false;

g_oldWndProc, g_hInst: THandle;


procedure RefreshRebar(myHwnd: hwnd);
var
hhwnd: hwnd;
begin
if myHwnd > 0 then
begin
InvalidateRect(myHwnd, nil, TRUE);
hhwnd := GetWindow(myHwnd, GW_CHILD);
while hhwnd > 0 do
begin
InvalidateRect(hhwnd, nil, TRUE);
hhwnd := GetWindow(hhwnd, GW_HWNDNEXT);
end;
end;
end;

procedure RefreshTaskbar(myHwnd: hwnd);
var
hwndTaskbar, hwndRebar, hwndTray, hwndStartButton: hwnd;
begin
hwndTray := GetParent(myHwnd);
hwndTaskbar := GetParent(hwndTray);
hwndRebar := FindWindowEx(hwndTaskbar, 0, 'ReBarWindow32', nil);
hwndStartButton := FindWindowEx(hwndTaskbar, 0, 'Button', nil);

InvalidateRect(hwndStartButton, nil, TRUE);
InvalidateRect(hwndTray, nil, TRUE);
PostMessage(hwndTray, WM_SIZE, SIZE_RESTORED, 0);

RefreshRebar(hwndRebar);
PostMessage(hwndRebar, WM_SIZE, SIZE_RESTORED, 0);
InvalidateRect(hwndTaskbar, nil, TRUE);
PostMessage(hwndTaskbar, WM_SIZE, SIZE_RESTORED, 0);
end;

function WndProc(hWnd: HWND; uMsg: UINT; wParam: wParam; lParam: LParam): lresult; stdcall;
begin
case uMsg of
WM_LBUTTONDOWN: MessageBoxA(0, 'Left mouse button', 'Test', 0);
end;

result := CallWindowProc(@g_oldWndProc, hWnd, uMsg, wParam, lParam);
end;

procedure InitClock(myHwnd: hwnd);
begin
if g_bInitClock then exit;
g_bInitClock := true;

g_oldWndProc := GetWindowLong(myHwnd, GWL_WNDPROC);
SetWindowLong(myHwnd, GWL_WNDPROC, LongInt(@WndProc));
RefreshTaskbar(myHwnd);
end;

function CallWndProc(ncode: integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
var
pcwps: PCWPSTRUCT;
begin
pcwps := PCWPSTRUCT(lParam);

if (ncode = HC_ACTION) then
begin
if (not g_bInitClock) and (pcwps.hwnd = g_hwndClock) then
InitClock(pcwps.hwnd);
end;

result := CallNextHookEx(g_hhook, ncode, wParam, lParam);
end;

function StartHook(): boolean; stdcall;
begin
g_hInst := GetModuleHandle('ClockHook.dll');

hwndTaskbar := FindWindow('Shell_TrayWnd', nil);
hwndTray := FindWindowEx(hwndTaskbar, 0, 'TrayNotifyWnd', nil);
g_hwndClock := FindWindowEx(hwndTray, 0, 'TrayClockWClass', nil);
idThread := GetWindowThreadProcessId(hwndTaskbar, nil);

g_hhook := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, g_hInst, idThread);

PostMessage(hwndTaskbar, WM_SIZE, SIZE_RESTORED, 0);

result := true;
end;

function StopHook(): boolean; stdcall;
begin
SetWindowLong(killhwnd, GWL_WNDPROC, g_oldWndProc);
g_oldWndProc := 0;
RefreshTaskbar(killhwnd);

result := UnhookWindowsHookEx(g_hhook);
g_hhook := 0;
end;

exports
StartHook,
StopHook;

begin
end.


Llama la atención que la captura del Wndproc de la ventanita en cuestión lo hace en el procedimiento InitClock.

A partir de ahí, creo tal como digo que no va a bastar con cambiar simplemente un texto del hint, sino que además vas a tener que crear una ventanita tipo Thint con el texto a exhibir.
No se me ocurre como enviarle un CM_HINTSHOW de la VCL.

Seguro que muchos de los ASES que tenemos aquí cuando lean esto, encuentran una solución al asunto, pero creo que lo te pongo es el inicio.

Un saludo estruendoso con petardos...:D

ixMike
03-03-2008, 16:47:02
Gracias, intentaré hacer algo con todo esto, no estoy muy puesto en APIs y Hooks :)

Seguro que muchos de los ASES que tenemos aquí cuando lean esto, encuentran una solución al asunto

Eso estaba esperando yo :D


Un saludo estruendoso con petardos...:D

Como diría el tío masclet (http://es.youtube.com/watch?v=HcYKRzy92Hk)... ¡Peiñ! :D:D


Salu2.

ArdiIIa
03-03-2008, 18:49:45
Como diría el tío masclet... ¡Peiñ! :D:D


Salu2.
El tío masclet, parece un profesional fallero mas que un fallero sin mas....

Como siempre la bonita la calle Sueca, corazón de Ruzafa....
No se si los vecinos están muy de acuerdo con él....

ixMike
04-03-2008, 00:02:45
Hola.

Faltó el uses ;)


uses Windows, Messages;


Pero no sé qué más tengo que añadir: :confused:

Undeclared identifier: 'killhwnd'


Buscando en Google "Delphi killhwnd" sólo salen 3 resultados, uno de ellos el de DelphiPraxis (si supiera alemán :o), otra de las página no tenía nada que ver, y la tercera estaba en japonés (jo, alemán y japonés, dos idiomas que me gustaría aprender).


"killhwnd" aparece en StopHook (para no haceros buscar ;)) ¿alguien sabe qué hacer?


Salu2. :)

ixMike
13-03-2008, 18:39:00
Bueno, en esa página que encontré en japonés, seguí un par de links donde ponía "TClock Light" y resultó ser un programa (que descargué en japones y en español :confused:) que hace maravillas :D: Modifica la apariencia del reloj, la del botón inicio (hasta le puedes meter un bitmap de fondo, también al menú), menú contextual del reloj, y el hint, ¡lo que yo buscaba! Lo malo es que el código está en C.

Me tocará traducir :D

Calculo que en un mes ya tengo el programita hecho ;) (o no, según como vea que llevo los exámenes:().

Salu2.

ArdiIIa
13-03-2008, 20:48:19
Se parece algo el código de lo que pusimos anteriormente ???

ixMike
13-03-2008, 21:01:56
Son como poco 30 archivos .c y .h de no menos de 5K cada uno, déjame un tiempo ;)

Lepe
13-03-2008, 21:28:30
yo llevo usando el TClockEx más de 4 años, tanto en w2000 como Xp y va de miedo. He visto su página web (http://www.rcis.co.za/dale/tclockex/) y dice que pase en unas semanas para ver si está colgado el código fuente. Parece que la última actualización es del año 2000... dudo que cuelgue los fuentes :p

Saludos

ixMike
13-03-2008, 21:36:31
Mira, el programa TClock Light que tengo me lleva a este enlace:
http://www.gratisweb.com/panchowatkins/tclock.htm

Ahí puedes descargártelo (es de 2004) y todos los idiomas en que está disponible, español inclusive. También lleva el código (en C).

Salu2.

ArdiIIa
13-03-2008, 21:46:17
Tiene que ser super-completo :D:D Cinco ejecutables y una dll...:eek:

masedano
13-04-2010, 19:34:19
ixMike
Estuve leyendo de tu "experimento"
Como te fue? Pudiste convertirlo?

Saludos