quello è purtroppo un po difficile :\
E' vero che ho indicato il linguaggio C, perché a me sta senza problemi anche quello, ma il codice che attualmente sto scrivendo, per tagliare i tempi, è in C#, codice che se va dopo converto, quindi non ho codice da postare
Ho scritto al volo il seguente codice che "dovrebbe" funzionare a livello di logica, però al 99.99% ci saranno degli errori, probabilmente cretini, nel codice
Le varie API fanno uso della User32.dll
codice:
include <stdio.h>
include <stdlib.h>
include <string.h>
include <user32.h>
DWORD trayClockHWND;
WNDPROC oldWndProc;
int main()
{
// Acquisisce l'HWND
trayClockHWND = 0;
EnumWindows(EnumWindowsProcCallback, null);
// Verifica che l'operazione sia riuscita
if (trayClockHWND == 0)
{
printf("Acquisizione fallita!"\r\n");
getchar();
return -1;
}
printf("Acquisizione Riuscita\r\n");
// Subclassa la tray clock
WNDPROC oldWndProc = (WNDPROC)SetWindowLong(
trayClockHWND,
GWL_WNDPROC,
(LONG)newWndProc);
printf("Subclassing Riuscito\r\n");
// Ripristina il vecchio gestore
SetWindowLong(
trayClockHWND,
GWL_WNDPROC,
(LONG)oldWndProc);
printf("Subclassing Rimosso\r\n");
// Esce dal programma
return 0;
}
LRESULT newWndProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
return CallWindowProc(oldWndProc, hwnd, uMsg, wParam, lParam);
}
BOOL CALLBACK EnumWindowsProc( HWND hwnd, LPARAM lParam )
{
// Verifica se è già settato il valore che si sta cercando
if (trayClockHWND > 0)
{
return 0;
}
// Inizializza il valore di ritorno per il nome della classe
char* className = mallock(256);
memset(className, 0, 256);
// Acquisisce il nome della classe
GetClassName(hwnd, className, 255);
// Esegue il confronto
if (strcmp(className, "TrayClockWClass") == 0)
{
// Acquisisce l'HWND
trayClockHWND = hwnd;
// Libera la memoria
free(className);
// Blocca l'enumerazione
return FALSE;
}
// Libera la memoria
free(className);
// Procede con l'enumerazione delle finestre figlio
EnumChildWindows(EnumWindowsProcCallback, null);
// Fa proseguire l'enumerazione
return TRUE;
}