Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1) Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
Seite 1 von 2 1 ... LetzteLetzte
Ergebnis 1 bis 20 von 27
  1. 10.02.2009, 23:06
    #1
    In diesem Beitrag geht es darum, wie mit wenig Aufwand jede(r) ein eigenes Today-Screen Plugin (Heute Bildschirm Plugin) erstellen kann. Dabei sollen ausschliesslich frei erhältliche tools verwendet werden.
    Begriffe wie Compiler, DLL, C, WINAPI, Registry, sollten keine Fremdwörter sein.

    Compiler Download, Installation und Konfiguration

    • Compiler/IDE Pelles C Entwicklungsumgebung (+Add In SDK)
    • Einen Remote Registry Editor. Falls der mit PellesC mitgelieferte Registry Editor nicht geht, kann man auch z.Bsp. CERegEditor verwenden.
      (nicht zwingend notwendig, die notwendigen registry einträge können auch vom pocketpc aus eingetragen werden)
    • MyMobiler (nicht zwingend notwendig, aber nützlich um alles vom PC aus bedienen zu können)

    Obige software downloaden und installieren, PellesC starten.
    Es empfiehlt sich folgende Einstellung in PellesC -> Menu->Tools|Extras zu ändern: Mit "Copy to Pocket PC" wird die jeweils erzeugte DLL in das pocketpc Windows Verzeichnis kopiert, mit einem doubleclick kann man das ändern z.bsp. in das "Temp" Verzeichnis: "$(TargetPath)" Temp

    Das wärs... Jetzt MyMobiler und CeRegedit starten (und verbinden).
    So sollte es dann etwa aussehen

    Notwendige Registryeinträge
    Damit unser today-plugin vom Windows Mobile today-screen erkannt wird,müssen minimal folgende registry Einträge einmalig erzeugt werden, unser Projekt soll TodayExample_1 heissen).
    HKEY_LOCAL_MACHINE\Software\Microsoft\Today\Items\TodayExample_1

    • DLL = "\Temp\TodayExample_1.dll" als STRING
    • Enabled = 0 als DWORD (0: das plugin soll nicht aktiv sein)
    • Type = 4 als DWORD (standard wert für ein "normales" plugin)

    TodayExample_1
    In diesem Beispiel soll ein Fenster auf dem Today Screen dargestellt werden, welches folgende Anforderungen erfüllt

    • Darstellung einer Textzeile, deren Inhalt sich periodisch ändert, hier solls ein Sekundenzähler tun,mittels der time() Funktion.
    • der Hintergrund soll dabei erhalten bleiben.
    • ein kleines Bildchen soll links angezeigt werden.
    • wenn man auf das plugin klickt, soll was passieren
      (Hier wird einfach Heute-Bildschirm-Einstellungen-Elemente aufgerufen - links klicken, sonst eine kleine MessageBox angezeigt)

    Im Anhang findet ihr alle benötigten Dateien als zip Archiv,downloaden,in ein beliebiges Verzeichnis entpacken und mit PellesC -> File->Open (Datei->Öffnen) TodayExample_1.ppj auswählen.
    Dateien:

    • TodayExample_1.ppj ist die PellesC Projekt Datei (Text)
    • TodayExample_1.c der vollständige c sourcecode
    • TodayExample_1.def die zu exportiernenden Funktionen
    • TodayExample_1.rc standard Windows Resourcen Datei, hier für untenstehendes Icon
    • TodayExample_1.ico ein transparentes bildchen/icon

    "TodayExample_1.c" ist das eigentliche (~50 zeilige) Programm, mit den drei Funktionen:

    • HWND APIENTRY InitializeCustomItem(TODAYLISTITEM *ptli, HWND hwndparent)
    • LRESULT WINAPI wmEvent(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) (der name ist beliebig wählbar)
    • BOOL WINAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)

    Ich habe diese drei Funktionen direkt im Sourcecode kommentiert.
    Code:
    /* 10.12.2008 by nimodo 
     * Today Plugin Example 1
     */
    #include <windows.h>
    #include <todaycmn.h>
    #include <Aygshell.h>
    /*-------------------------------------------------------------------
     * globals, prefix g_ or G_ means global for this file */
    #define   G_APPLICATION_NAME  TEXT("Today_Example_1") 
    #define   G_TODAY_HEIGHT         22  /* Today Plugin Window Height */
    #define   G_IDR_ICO_MAIN       8001  /* Icon Id in ressource file (.rc) */ 
    HICON     g_hIcon         =  NULL; /* Left image - Icon Handle (res1.ico) */
    HINSTANCE g_hInstance     =  NULL; /* This DLL Instance */ 
    WCHAR     g_InfoLine[128];         /* String showing "g_Time [s]" */
    time_t    g_TimeStart=0,           /* := time(NULL) seconds since 1970 */
              g_Time=0;                /* := time(NULL) - g_TimeStart */ 
    RECT      g_UpdateRect;            /* Only refresh this rectangle, not the whole plugin window */ 
    /*-------------------------------------------------------------------
     * Required custom entry for today-screen function
     * - Must be declared in .def file with ordinal 240
     * - Useful could be CustomItemOptionsDlgProc(...) ordinal 241 to 
     *   show an optional options dialog  */
    HWND APIENTRY InitializeCustomItem(TODAYLISTITEM *ptli, HWND hwndparent) 
    {
      HWND hwnd;
      if ( 0==ptli->fEnabled )  return NULL; /* Enabled option in registry */
      g_hInstance = ptli->hinstDLL;
      hwnd = CreateWindow (G_APPLICATION_NAME, G_APPLICATION_NAME, 
                           WS_VISIBLE|WS_CHILD, 
                           CW_USEDEFAULT, CW_USEDEFAULT, 
                           CW_USEDEFAULT, G_TODAY_HEIGHT,
                           hwndparent, NULL, g_hInstance, NULL);
      return hwnd;
    }
    /*-------------------------------------------------------------------
     * Main windows event handler - WNDCLASS.lpfnWndProc */
    LRESULT WINAPI wmEvent(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    {     
      switch(msg)
      {
        case WM_PAINT:
        {
          PAINTSTRUCT ps;
         COLORREF    cr;
          RECT        rc;
         HDC        hdc;  
          /* Get window rectangle of this plugin */    
          GetClientRect(hwnd, &rc);        
          /* Start painting on screen */
          hdc = BeginPaint(hwnd, &ps);     
          /* Transparent painting to preserve background  */
          SetBkMode(hdc,TRANSPARENT);
          /* Draw icon at x,y (2,2)*/
          DrawIcon(hdc, 2, 2, g_hIcon);
          /* Get today-screen system text color, and set it */ 
          cr = SendMessage(GetParent(hwnd), TODAYM_GETCOLOR,TODAYCOLOR_TEXT, 0);
          SetTextColor(hdc,cr);
          /* Set rectangle where the text should be drawn, save updating-rect to g_UpdateRect */ 
          SetRect(&g_UpdateRect,rc.left+40,rc.top,rc.right,rc.bottom);    
          /* Get actual time in seconds and write to g_InfoLine, draw text */
          g_Time = time(NULL) - g_TimeStart;
         swprintf( g_InfoLine, TEXT("%ld s since today_example_1 started"), g_Time);    
          DrawText(hdc, g_InfoLine, 10, &g_UpdateRect, DT_SINGLELINE );       
          /* Stop painting */    
          EndPaint(hwnd, &ps);    
        }
        break;  
        /* Catch this message to prevent background destroying, comes after 
         *  WM_PAINT  */
        case WM_ERASEBKGND:
        {
          TODAYDRAWWATERMARKINFO dwi;
          dwi.hdc = (HDC)wp;
          GetClientRect(hwnd, &dwi.rc);
          dwi.hwnd = hwnd;
          SendMessage(GetParent(hwnd), TODAYM_DRAWWATERMARK, 0,(LPARAM)&dwi);  
        }    
        break; /* return 0 or 1  ? - actually 0 */
        /* Do some action depending where the stylus went up (see also WM_LBUTTONDOWN) */
        case WM_LBUTTONUP:
        {
         POINT pt;
         PROCESS_INFORMATION pi;
         pt.x = LOWORD(lp);  /* pt.y = HIWORD(lp); */
         /* On click left -> start today - settings - items */
         if ( pt.x < 40 )
         {
            CreateProcess(TEXT("\\Windows\\ctlpnl.exe"), TEXT("cplmain.cpl,13,1"), 
                          NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
         }
         else 
         {
            MessageBox(NULL,TEXT("WM_LBUTTONUP"),G_APPLICATION_NAME, MB_OK);
         }
        }
        break; 
        /* Catch this mesage, to assure the content is updated - InvalidateRect */ 
        case WM_TODAYCUSTOM_QUERYREFRESHCACHE:
        {
          TODAYLISTITEM *ptli = (TODAYLISTITEM *)wp;
          if ( 0==ptli->cyp  )
         {
            ptli->cyp = G_TODAY_HEIGHT;
            return 1;
           }
          else
          {
            InvalidateRect(hwnd, &g_UpdateRect, TRUE);
            return 0;
          }
        }
        break;
        /* Proceed to default windows event handler */
        default: 
       return DefWindowProc(hwnd, msg, wp, lp) ;
      }
      return 0;   
    }
    /*-------------------------------------------------------------------
     * Main DLL entry function  */
    BOOL WINAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
    { 
      switch (dwReason)   
      {
            case DLL_PROCESS_ATTACH:
                g_hInstance = (HINSTANCE)hModule;
                WNDCLASS     wc;
                memset(&wc, 0, sizeof(wc));
                wc.style         = CS_HREDRAW | CS_VREDRAW;
                wc.lpfnWndProc   = (WNDPROC)wmEvent;
                wc.hInstance     = g_hInstance;
                g_hIcon          = LoadIcon(g_hInstance, MAKEINTRESOURCE(G_IDR_ICO_MAIN)); 
                wc.hIcon         = g_hIcon;
                wc.hCursor       = NULL;
                wc.hbrBackground = (struct HBRUSH__*)GetStockObject(WHITE_BRUSH);
                wc.lpszClassName = G_APPLICATION_NAME;
                UnregisterClass(G_APPLICATION_NAME, g_hInstance);
                RegisterClass(&wc);
             g_TimeStart = time(NULL);
            break;    
            case DLL_PROCESS_DETACH:
               UnregisterClass(G_APPLICATION_NAME, (HINSTANCE)hModule);
                DestroyIcon(g_hIcon);
                g_hIcon     = NULL;
                g_hInstance = NULL;
            break;
      }
      return TRUE;
    }
    Installieren,Deinstallieren und Löschen
    Obige erzeugte DLL wird installiert, indem sie zBsp via PellesC - Tools - "Copy to Pocket PC" auf den pocketpc kopiert wird. Falls das Today Plugin schon existiert, muss es vor dem kopieren zuerst deaktiviert werden (Start - Settings|Einstellungen - Today|Heute - Items|Elemente TodayExample_1 deaktivieren) Löschen kann man einfach mit dem FileExplorer oder TotalCommander (das Plugin muss vorher deaktiviert sein)


    viel spass beim experimentieren

    gruss nimodo
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)-todayexample_1_a.jpg   Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)-todayexample_1_b.jpg  
    Angehängte Dateien Angehängte Dateien
    3
     

  2. 18.02.2009, 21:13
    #2
    Die Textgrösse unseres Today_Example_1 soll noch an die System Textgrösse angepasst werden. Start->Einstellungen|Settings->System->Bildschirm|Screen->Textgrösse|Textsize)
    Eine Möglichkeit, dies zu erreichen ist aus HKLM\\ControlPanel\\Stylus\\192DPI (beim HTC Touch HD) die Variable CurFont auszulesen
    Code:
    void Update(void)
    {
      HKEY  hk;
      DWORD bv, dws = sizeof(DWORD);
      /* Text size (Start->Settings->System->Screen->Textsize) */ 
      if ( ERROR_SUCCESS==RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
                           TEXT("ControlPanel\\Stylus\\192DPI"), (DWORD)0, KEY_QUERY_VALUE, &hk) )
      {
          if ( ERROR_SUCCESS==RegQueryValueEx(hk, TEXT("CurFont"), NULL, NULL, (PBYTE)&bv, &dws ) )
          {
            g_TextSize = bv;
          }  
      }
      RegCloseKey(hk);
    }/
    Die Funktion Update() muss sowohl beim starten des Plugins als auch nachdem ev. die Einstellung gewechselt wurde - also in DLL_PROCESS_ATTACH und (z.Bsp.) in WM_ERASEBKGND - aufgerufen werden.
    Wie die aus der Registry gelesene Textgrösse anzuwenden ist, habe ich in WM_PAINT dokumentiert. ( das Kreuz mit den Windows Fonts.... )

    Today_Example_1.c
    Code:
    /* 17.02.2009 by nimodo 
     * Today Plugin Example 1
     */
    #include <windows.h>
    #include <tchar.h>
    #include <todaycmn.h>
    #include <Aygshell.h>
    /*-------------------------------------------------------------------
     * globals, prefix g_ or G_ means global for this file */
    #define   G_APPLICATION_NAME  TEXT("Today_Example_1") 
    #define   G_TODAY_HEIGHT         22 /* Today Plugin Window Height */
    #define   G_IDR_ICO_MAIN       8001 /* Icon Id in ressource file (.rc) */ 
    #define   G_ICON_WIDTH           20 /* Left icon width (#8001,... ) */
    #define   G_TEXT_SIZE          1000 /* Default curfon textsize */
    
    HICON     g_hIcon         =  NULL; /* Left image - Icon Handle (.ico) */
    HINSTANCE g_hInstance     =  NULL; /* This DLL Instance */ 
    WCHAR     g_InfoLine[128],         /* Content text  */
              g_InfoDebug[40];
    time_t    g_TimeStart=0,           /* := time(NULL) seconds since 1970 */
              g_Time=0;                /* := time(NULL)-g_TimeStart seconds since plugin started */ 
    RECT      g_UpdateRect;            /* Only refresh this rectangle, not the whole plugin window */ 
    DWORD     g_TextSize = G_TEXT_SIZE;/* Default text size, if not read from
                                         ([HKEY_LOCAL_MACHINE\ControlPanel\Stylus\192DPI]) */ 
    /*-------------------------------------------------------------------
     * Read settings from registry.
     * */
    void Update(void)
    {
      HKEY  hk;
      DWORD bv, dws = sizeof(DWORD);
      /* Text size (Start->Settings->System->Screen->Textsize) */ 
      if ( ERROR_SUCCESS==RegOpenKeyEx( HKEY_LOCAL_MACHINE ,
                           TEXT("ControlPanel\\Stylus\\192DPI"), (DWORD)0, KEY_QUERY_VALUE, &hk) )
      {
          if ( ERROR_SUCCESS==RegQueryValueEx(hk, TEXT("CurFont"), NULL, NULL, (PBYTE)&bv, &dws ) )
          {
            g_TextSize = bv;
          }  
      }
      RegCloseKey(hk);
    }
    /*-------------------------------------------------------------------
     * Required custom entry for today-screen function
     * - Must be declared in .def file with ordinal 240
     * - Useful could be CustomItemOptionsDlgProc(...) ordinal 241 to 
     *   show an optional options dialog  */
    HWND APIENTRY InitializeCustomItem(TODAYLISTITEM *ptli, HWND hwndparent) 
    {
      HWND hwnd;
      if ( 0==ptli->fEnabled )  return NULL; /* Disabled option in registry */
      g_hInstance = ptli->hinstDLL;
      hwnd = CreateWindow (G_APPLICATION_NAME, G_APPLICATION_NAME, 
                           WS_VISIBLE|WS_CHILD, 
                           CW_USEDEFAULT, CW_USEDEFAULT, 
                           CW_USEDEFAULT, G_TODAY_HEIGHT,
                           hwndparent, NULL, g_hInstance, NULL);
      return hwnd;
    }
    
    /*-------------------------------------------------------------------
     * Main windows event handler - WNDCLASS.lpfnWndProc */
    LRESULT WINAPI wmEvent(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    {     
      switch(msg)
      {
        case WM_PAINT:
        {
          PAINTSTRUCT ps;
          COLORREF    cr,crold;
          RECT        rc;
          HDC        hdc;  
          HFONT    hf, hsysf, holdf; 
          LOGFONT  lf; 
          /* Get window rectangle of this plugin */    
          GetClientRect(hwnd, &rc);        
          /* Start painting on screen */
          hdc = BeginPaint(hwnd, &ps);     
          /* Transparent painting to preserve background  */
          SetBkMode(hdc,TRANSPARENT);
          /* Draw icon at x,y (2,2)*/
          DrawIcon(hdc, 2, 2, g_hIcon);
          /* Get system font */
          hsysf = GetStockObject(SYSTEM_FONT);
          GetObject(hsysf, sizeof(LOGFONT), &lf);
          lf.lfWeight = FW_NORMAL;
          lf.lfHeight = (LONG) -( (double)GetDeviceCaps(hdc, LOGPIXELSY)/72.0*g_TextSize/100.0);
          hf    = CreateFontIndirect(&lf);
          holdf = SelectObject(hdc, hf);
          SendMessage(GetParent(hwnd),WM_SETFONT,(WPARAM)hf,MAKELPARAM(TRUE,0));
          /* Get today-screen system text color, and set it */ 
          cr    = SendMessage(GetParent(hwnd), TODAYM_GETCOLOR,TODAYCOLOR_TEXT, 0);
          crold = SetTextColor(hdc,cr);
          /* Set rectangle where the text should be drawn, save updating-rect to g_UpdateRect */ 
          SetRect(&g_UpdateRect,rc.left+30,rc.top,rc.right,rc.bottom);    
          /* Get actual time in seconds and write to g_InfoLine, draw text */
          g_Time = time(NULL) - g_TimeStart;
          swprintf( g_InfoLine, TEXT("%ld s  %s"), g_Time, g_InfoDebug );     
          DrawText(hdc, g_InfoLine, wcslen(g_InfoLine), &g_UpdateRect, DT_SINGLELINE );       
          /* Stop painting & reset font settings */ 
          SelectObject(hdc, holdf);
          DeleteObject(hf);   
          SetTextColor(hdc,crold);
          EndPaint(hwnd, &ps);    
        }
        break;  
        /* Catch this message to prevent background destroying, comes after 
         *  WM_PAINT  */
        case WM_ERASEBKGND:
        {
          TODAYDRAWWATERMARKINFO dwi;
          Update(); /* in case global settings were changed, reread... */
          dwi.hdc = (HDC)wp;
          GetClientRect(hwnd, &dwi.rc);
          dwi.hwnd = hwnd;
          SendMessage(GetParent(hwnd), TODAYM_DRAWWATERMARK, 0,(LPARAM)&dwi);  
        }    
        break; 
        /* Do some action depending where the stylus went up (see also WM_LBUTTONDOWN) */
        case WM_LBUTTONUP:
        {
         POINT pt;
         PROCESS_INFORMATION pi;
         pt.x = LOWORD(lp);  /* pt.y = HIWORD(lp); */
          /* On click left -> start today - settings - items */
         if ( pt.x <= G_ICON_WIDTH )
         {
            CreateProcess(TEXT("\\Windows\\ctlpnl.exe"), TEXT("cplmain.cpl,13,1"), 
                          NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
         }
         else 
         {
            CreateProcess(TEXT("\\Windows\\ctlpnl.exe"), TEXT("cplmain.cpl,13,2"), 
                          NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);    
         }
        }
        break; 
        /* Catch this mesage, to assure the content is updated - InvalidateRect */ 
        case WM_TODAYCUSTOM_QUERYREFRESHCACHE:
        {
          TODAYLISTITEM *ptli = (TODAYLISTITEM *)wp;
          if ( 0==ptli->cyp  )
          {
            ptli->cyp = G_TODAY_HEIGHT;
            return 1;
            }
          else
          {
            InvalidateRect(hwnd, &g_UpdateRect, TRUE);
            return 0;
          }
        }
        break;
        /* Proceed to default windows event handler */
        default: 
        return DefWindowProc(hwnd, msg, wp, lp) ;
      }
      return 0;    
    }
    /*-------------------------------------------------------------------
     * Main DLL entry function  */
    BOOL WINAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
    { 
      switch (dwReason)   
      {
            case DLL_PROCESS_ATTACH:
                g_hInstance = (HINSTANCE)hModule;
                WNDCLASS     wc;
                memset(&wc, 0, sizeof(wc));
                wc.style         = CS_HREDRAW | CS_VREDRAW;
                wc.lpfnWndProc   = (WNDPROC)wmEvent;
                wc.hInstance     = g_hInstance;
                g_hIcon          = LoadIcon(g_hInstance, MAKEINTRESOURCE(G_IDR_ICO_MAIN)); 
                wc.hIcon         = g_hIcon;
                wc.hCursor       = NULL;
                wc.hbrBackground = (struct HBRUSH__*)GetStockObject(WHITE_BRUSH);
                wc.lpszClassName = G_APPLICATION_NAME;
                UnregisterClass(G_APPLICATION_NAME, g_hInstance);
                RegisterClass(&wc);
                g_TimeStart = time(NULL);
                swprintf( g_InfoDebug, TEXT("--") );     
                Update();
            break;    
            case DLL_PROCESS_DETACH:
                 UnregisterClass(G_APPLICATION_NAME, (HINSTANCE)hModule);
                DestroyIcon(g_hIcon);
                g_hIcon     = NULL;
                g_hInstance = NULL;
            break;
      }
      return TRUE;
    }
    gruss, nimodo
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)-te_1_1.jpg  
    3
     

  3. 20.02.2009, 22:13
    #3
    Um das Gleiche wie oben zu erreichen gibt es auch noch eine sehr interessante (1) andere Möglichkeit:
    Die Windows Funktion RegistryNotifyWindow(...).
    Mit RegistryNotifyWindow kann man Windows "klarmachen", dass man gefälligst informiert werden will, falls in der Registry Aenderungen gemacht wurden.
    In unserem einfachen Fall (Textgrösse) genügt folgender Aufruf
    Code:
    RegistryNotifyWindow(
              HKEY_LOCAL_MACHINE,
              TEXT("ControlPanel\\Stylus\\192DPI"), 
              TEXT("CurFont"), 
              hwnd, WM_TEXTSIZE_CHANGED, (DWORD)0, NULL, 
              &g_hNotify)
    Diese Funktion muss nach dem Erzeugen eines gültigen Plugin-Fensters (hwnd) aufgerufen werden, d.h. in InitializeCustomItem().
    Mit definiertem WM_TEXTSIZE_CHANGED wird die event-id Windows bekanntgemacht,die nachher im event handler wmEvent() ... abgefangen werden kann.

    Um dies einfach auszuprobieren, habe ich diesmal den Klickbereich rechts des Plugins mit
    Code:
    CreateProcess(TEXT("\\Windows\\ctlpnl.exe"), 
    TEXT("cplmain.cpl,7,2"),NULL, NULL, FALSE, 0, NULL, NULL, NULL,&pi);
    "verknüpft", das führt direkt zur Einstellung der Textgrösse (siehe auch code).

    Today_Example_1
    Code:
    /* 20.02.2009 by nimodo 
     * Today Plugin Example 1
     */
    #include <windows.h>
    #include <tchar.h>
    #include <todaycmn.h>
    #include <aygshell.h>
    #include <regext.h>
    /*-------------------------------------------------------------------
     * globals, prefix g_ or G_ means global for this file */
    #define   G_APPLICATION_NAME  TEXT("Today_Example_1") 
    #define   G_TODAY_HEIGHT         22 /* Today Plugin Window Height */
    #define   G_IDR_ICO_MAIN       8001 /* Icon Id in ressource file (.rc) */ 
    #define   G_ICON_WIDTH           20 /* Left icon width (#8001,... ) */
    #define   G_REG_ROOT           HKEY_LOCAL_MACHINE
    #define   G_REG_PATH_TEXTSIZE  TEXT("ControlPanel\\Stylus\\192DPI")   
    #define   G_REG_VAR_TEXTSIZE   TEXT("CurFont")
    #define   WM_TEXTSIZE_CHANGED  WM_USER + 1  /* Reg. notification event */
    HICON      g_hIcon       = NULL;   /* Left image - Icon Handle (.ico) */
    HINSTANCE  g_hInstance   = NULL;   /* This DLL Instance */ 
    HREGNOTIFY g_hNotify     = NULL;   /* Reg notification handle */
    WCHAR      g_InfoLine[128],        /* Content text  */
               g_InfoDebug[40];
    time_t     g_TimeStart=0,          /* := time(NULL) seconds since 1970 */
               g_Time=0;               /* := time(NULL)-g_TimeStart seconds since plugin started */ 
    RECT       g_UpdateRect;           /* Only refresh this rectangle, not the whole plugin window */ 
    DWORD      g_TextSize = 1000;      /* Default text size */                                    
    /*-------------------------------------------------------------------
     * Read startup settings from registry.
     * */
    void ReadSettings(void)
    {
      HKEY  hk;
      DWORD bv, dws = sizeof(DWORD);
      /* Text size (Start->Settings->System->Screen->Textsize) */ 
      if ( ERROR_SUCCESS==RegOpenKeyEx( G_REG_ROOT ,G_REG_PATH_TEXTSIZE, 
                                       (DWORD)0, KEY_QUERY_VALUE, &hk) )
      {
          if ( ERROR_SUCCESS==RegQueryValueEx(hk, G_REG_VAR_TEXTSIZE, 
                                              NULL, NULL, (PBYTE)&bv, &dws ) )
          {
            g_TextSize = bv;
          }  
      }
      RegCloseKey(hk);
    }
    /*-------------------------------------------------------------------
     * Required custom entry for today-screen function
     * - Must be declared in .def file with ordinal 240
     * - Useful could be CustomItemOptionsDlgProc(...) ordinal 241 to 
     *   show an optional options dialog  */
    HWND APIENTRY InitializeCustomItem(TODAYLISTITEM *ptli, HWND hwndparent) 
    {
      HWND    hwnd;
      if ( 0==ptli->fEnabled )  return NULL; /* Disabled option in registry */  
      g_hInstance = ptli->hinstDLL;
      hwnd = CreateWindow (G_APPLICATION_NAME, G_APPLICATION_NAME, 
                           WS_VISIBLE|WS_CHILD, 
                           CW_USEDEFAULT, CW_USEDEFAULT, 
                           CW_USEDEFAULT, G_TODAY_HEIGHT,
                           hwndparent, NULL, g_hInstance, NULL);  
      /* Register a broker to get textsize changes in registry, 
         HRESULT return value should be used  */ 
      RegistryNotifyWindow(G_REG_ROOT,  G_REG_PATH_TEXTSIZE, G_REG_VAR_TEXTSIZE, 
                           hwnd, WM_TEXTSIZE_CHANGED, (DWORD)0, NULL, &g_hNotify); 
      return hwnd;
    }
    /*-------------------------------------------------------------------
     * Main windows event handler - WNDCLASS.lpfnWndProc */
    LRESULT WINAPI wmEvent(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    {     
      switch(msg)
      {
        case WM_TEXTSIZE_CHANGED:
          g_TextSize = (DWORD)wp; 
        break;
    
        case WM_PAINT:
        {
          PAINTSTRUCT ps;
    	  COLORREF    cr,crold;
          RECT        rc;
    	  HDC        hdc;  
          HFONT    hf, hsysf, holdf; 
          LOGFONT  lf; 
          /* Get window rectangle of this plugin */    
          GetClientRect(hwnd, &rc);        
          /* Start painting on screen */
          hdc = BeginPaint(hwnd, &ps);     
          /* Transparent painting to preserve background  */
          SetBkMode(hdc,TRANSPARENT);
          /* Draw icon at x,y (2,2)*/
          DrawIcon(hdc, 2, 2, g_hIcon);
          /* Get system font */
          hsysf = GetStockObject(SYSTEM_FONT);
          GetObject(hsysf, sizeof(LOGFONT), &lf);
          lf.lfWeight = FW_NORMAL;
          lf.lfHeight = (LONG) -( (double)GetDeviceCaps(hdc, LOGPIXELSY)/72.0*g_TextSize/100.0);
          hf    = CreateFontIndirect(&lf);
          holdf = SelectObject(hdc, hf);
          SendMessage(GetParent(hwnd),WM_SETFONT,(WPARAM)hf,MAKELPARAM(TRUE,0));
          /* Get today-screen system text color, and set it */ 
          cr    = SendMessage(GetParent(hwnd), TODAYM_GETCOLOR,TODAYCOLOR_TEXT, 0);
          crold = SetTextColor(hdc,cr);
          /* Set rectangle where the text should be drawn, save updating-rect to g_UpdateRect */ 
          SetRect(&g_UpdateRect,rc.left+30,rc.top,rc.right,rc.bottom);    
          /* Get actual time in seconds and write to g_InfoLine, draw text */
          g_Time = time(NULL) - g_TimeStart;
    	  swprintf( g_InfoLine, TEXT("%ld s  %s"), g_Time, g_InfoDebug );	 
          DrawText(hdc, g_InfoLine, wcslen(g_InfoLine), &g_UpdateRect, DT_SINGLELINE );       
          /* Stop painting & reset font settings */ 
          SelectObject(hdc, holdf);
          DeleteObject(hf);   
          SetTextColor(hdc,crold);
          EndPaint(hwnd, &ps);    
        }
        break;  
        /* Catch this message to prevent background destroying, comes after 
         *  WM_PAINT  */
        case WM_ERASEBKGND:
        {
          TODAYDRAWWATERMARKINFO dwi;
          dwi.hdc = (HDC)wp;
          GetClientRect(hwnd, &dwi.rc);
          dwi.hwnd = hwnd;
          SendMessage(GetParent(hwnd), TODAYM_DRAWWATERMARK, 0,(LPARAM)&dwi);  
        }    
        break; 
        /* Do some action depending where the stylus went up (see also WM_RBUTTONDOWN) */
        case WM_LBUTTONUP:
        {
          POINT pt;
          PROCESS_INFORMATION pi;
          pt.x = LOWORD(lp);  /* pt.y = HIWORD(lp); */
     	  /* On click left -> start today - settings - items */
          if ( pt.x <= G_ICON_WIDTH )
          {
            CreateProcess(TEXT("\\Windows\\ctlpnl.exe"), TEXT("cplmain.cpl,13,1"), 
                          NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
          }
          else 
          {
             CreateProcess(TEXT("\\Windows\\ctlpnl.exe"), TEXT("cplmain.cpl,7,2"), 
                           NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);    
          }
        }
        break; 
        /* Catch this mesage, to assure the content is updated - InvalidateRect */ 
        case WM_TODAYCUSTOM_QUERYREFRESHCACHE:
        {
          TODAYLISTITEM *ptli = (TODAYLISTITEM *)wp;
          if ( 0==ptli->cyp  )
    	  {
            ptli->cyp = G_TODAY_HEIGHT;
            return 1;
      	  }
          else
          {
            InvalidateRect(hwnd, &g_UpdateRect, TRUE);
            return 0;
          }
        }
        break;
        /* Proceed to default windows event handler */
        default: 
    	return DefWindowProc(hwnd, msg, wp, lp) ;
      }
      return 0;	
    }
    /*-------------------------------------------------------------------
     * Main DLL entry function  */
    BOOL WINAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
    { 
      switch (dwReason)   
      {
            case DLL_PROCESS_ATTACH:
                g_hInstance = (HINSTANCE)hModule;
                WNDCLASS     wc;
                memset(&wc, 0, sizeof(wc));
                wc.style         = CS_HREDRAW | CS_VREDRAW;
                wc.lpfnWndProc   = (WNDPROC)wmEvent;
                wc.hInstance     = g_hInstance;
                g_hIcon          = LoadIcon(g_hInstance, MAKEINTRESOURCE(G_IDR_ICO_MAIN)); 
                wc.hIcon         = g_hIcon;
                wc.hCursor       = NULL;
                wc.hbrBackground = (struct HBRUSH__*)GetStockObject(WHITE_BRUSH);
                wc.lpszClassName = G_APPLICATION_NAME;
                UnregisterClass(G_APPLICATION_NAME, g_hInstance);
                RegisterClass(&wc);
                g_TimeStart = time(NULL);
                swprintf( g_InfoDebug, TEXT("--") );	 
                ReadSettings();
            break;    
            case DLL_PROCESS_DETACH:
     		    UnregisterClass(G_APPLICATION_NAME, (HINSTANCE)hModule);
                DestroyIcon(g_hIcon);
                g_hIcon     = NULL; 
                g_hInstance = NULL;
                if (g_hNotify) RegistryCloseNotification(g_hNotify);
                g_hNotify   = NULL;
            break;
      }
      return TRUE;
    }
    viel spass, nimodo

    (1) sehr interessant, da die registry ein interessanter Ort im WM ist , auch bezüglich dynamischer Informationen (tel,sms, ...).
    3
     

  4. 13.03.2009, 22:32
    #4
    In diesem thread fehlt noch eine sinnvolle anzeige für das plugin Ich hätte zBsp gerne die aktuelle gps position, geschwindigkeit, kompass,... auf meinem today bildschirm. Die funktionen und datenstrukturen zu GPS findet man in der gpsapi.h. Ich habe sie mal gesichtet und mir ein paar einfache zugriffsfunktionen darauf zusammengebastelt.
    gpsutil.c
    Code:
    /* 05.03.2009 by nimodo 
     * GPS access utility functions - see also PellesC gps example
     */
    #include <windows.h>
    #include <tchar.h>
    #include <gpsapi.h>
    #include <service.h> 
    /* create events for async gps data receiving 
     */
    BOOL gpsOpen(HANDLE *phdev, HANDLE *phevnp, HANDLE *phevns)
    {
     *phevnp = CreateEvent(NULL, FALSE, FALSE, NULL);
     if ( *phevnp )
     {
        *phevns = CreateEvent(NULL, FALSE, FALSE, NULL);
        if (*phevns) 
        {
           *phdev = GPSOpenDevice(*phevnp, *phevns, NULL, 0);
        }
     }
     return ( (*phdev) && (*phevnp) && (*phevns) );
    }
    /* close gps receiver and events */
    BOOL gpsClose(HANDLE hdev, HANDLE hevnp, HANDLE hevns)
    {
     if (hdev)  GPSCloseDevice(hdev);
     if (hevnp) CloseHandle(hevnp);
     if (hevns) CloseHandle(hevns);
     return(FALSE);
    }
    /* get gps data */
    DWORD gpsPosition(HANDLE hdev, PGPS_POSITION pgp )
    {
     DWORD dwe;   
     ZeroMemory(pgp,sizeof(GPS_POSITION));
     pgp->dwVersion = GPS_VERSION_1;
     pgp->dwSize    = sizeof(GPS_POSITION);  
     dwe = GPSGetPosition(hdev, pgp, 5000, 0);
     return( dwe );
    }
    /* get gps state */
    DWORD gpsStatus(WCHAR *pwc)
    {
     GPS_DEVICE gd;
     ZeroMemory(&gd,sizeof(gd));
     gd.dwVersion = GPS_VERSION_1;
     gd.dwSize    = sizeof(GPS_DEVICE);
     DWORD    dwe = GPSGetDeviceState(&gd);
     if (  ERROR_SUCCESS==dwe )
     {
       swprintf(pwc,TEXT("%.20s... service is "), gd.szGPSFriendlyName); 
       switch (gd.dwServiceState)
       {
         case SERVICE_STATE_OFF:          wcscat(pwc,TEXT("off          ")); break;
         case SERVICE_STATE_ON:           wcscat(pwc,TEXT("on           ")); break;
         case SERVICE_STATE_STARTING_UP:  wcscat(pwc,TEXT("starting up  ")); break;
         case SERVICE_STATE_SHUTTING_DOWN:wcscat(pwc,TEXT("shutting down")); break;
         case SERVICE_STATE_UNLOADING:    wcscat(pwc,TEXT("unloading    ")); break; 
         case SERVICE_STATE_UNINITIALIZED:wcscat(pwc,TEXT("uninitialized")); break; 
         default:                         wcscat(pwc,TEXT("unknown      ")); break; 
       }
     }
     else
     {
       wcscpy(pwc, TEXT("gps service is off"));
     }
     return dwe;
    }
    /* convert decimal coordinate to deg min sec*/
    void gpsDecToDegMinSec(WCHAR wcd[2], double dc, DWORD *id, DWORD *im, double *ds, WCHAR *wc)
    {
      /* ° degs */
      if ( id==NULL || im==NULL || ds==NULL ) return;
      *id = (int)(dc);
      /* ' minutes */
      *im = (int)( (dc - (double)*id)*60.0 );
      /* '' seconds */ 
      *ds = 3600.0 * (dc - (*id + *im/60.0) ); 
      /* print it to a string */
      if (wc)
      {
         swprintf(wc,TEXT("%c %02d°%02d\'%02.0f\"   "),(*id>0)?wcd[0]:wcd[1] ,*id, *im, *ds );  
      }
    }
    /* print some info from GPS_POSITION into pwc
     * caller takes care, that pwc is big enough  
     * available data: 
        DWORD dwVersion;
        DWORD dwSize;
        DWORD dwValidFields;
        DWORD dwFlags;
        SYSTEMTIME stUTCTime;
        double dblLatitude;
        double dblLongitude;
        float flSpeed;
        float flHeading;
        double dblMagneticVariation;
        float flAltitudeWRTSeaLevel;
        float flAltitudeWRTEllipsoid;
        GPS_FIX_QUALITY FixQuality;
        GPS_FIX_TYPE FixType;
        GPS_FIX_SELECTION SelectionType;
        float flPositionDilutionOfPrecision;
        float flHorizontalDilutionOfPrecision;
        float flVerticalDilutionOfPrecision;
        DWORD dwSatelliteCount;
        DWORD rgdwSatellitesUsedPRNs[GPS_MAX_SATELLITES];
        DWORD dwSatellitesInView;
        DWORD rgdwSatellitesInViewPRNs[GPS_MAX_SATELLITES];
        DWORD rgdwSatellitesInViewElevation[GPS_MAX_SATELLITES];
        DWORD rgdwSatellitesInViewAzimuth[GPS_MAX_SATELLITES];
        DWORD rgdwSatellitesInViewSignalToNoiseRatio[GPS_MAX_SATELLITES];
     */
    void gpsInfo(HANDLE hdev, PGPS_POSITION pgp, WCHAR *pwc1, WCHAR *pwc2)
    {
      WCHAR  wcpos[20];
      DWORD  dwe,id,im;
      double ds;
      dwe = gpsPosition(hdev, pgp );
      /* position */
      if ( dwe==ERROR_SUCCESS )
      {
        /* satellite count */   
        swprintf(pwc1,TEXT("Sats view/fixed ") );  
    
       if ( pgp->dwValidFields & GPS_VALID_SATELLITES_IN_VIEW )
           swprintf(wcpos,TEXT("%02d/"), pgp->dwSatellitesInView );  
        else
           wcscpy(wcpos,TEXT(" 00/") );  
        wcscat(pwc1,wcpos);
    
       if ( pgp->dwValidFields & GPS_VALID_SATELLITE_COUNT )
           swprintf( wcpos,TEXT("%02d  "), pgp->dwSatelliteCount );  
        else
           wcscpy( wcpos,TEXT("00  " ) );  
        wcscat(pwc1,wcpos);
        /* velocity */
        if ( pgp->dwValidFields & GPS_VALID_SPEED )
        {
          swprintf(wcpos,TEXT("%4.1f km/h  "), pgp->flSpeed );  
          wcscat(pwc1,wcpos);
        }   
        /* direction */
        if ( pgp->dwValidFields & GPS_VALID_HEADING )
        {
          swprintf(wcpos,TEXT("%3.1f°"), pgp->flHeading );  
          wcscat(pwc1,wcpos);
        }
        /* latitude */
        if ( pgp->dwValidFields & GPS_VALID_LATITUDE )
           gpsDecToDegMinSec(TEXT("NS"), pgp->dblLatitude, &id, &im, &ds, pwc2);
        /* longitude */
        if ( pgp->dwValidFields & GPS_VALID_LONGITUDE )
        {
          gpsDecToDegMinSec(TEXT("EW"), pgp->dblLongitude, &id, &im, &ds, wcpos);
          wcscat(pwc2,wcpos);
        }
        /* altitude */
        if ( pgp->dwValidFields & GPS_VALID_ALTITUDE_WRT_ELLIPSOID )
        { 
          swprintf(wcpos,TEXT("A %4.0f m"), pgp->flAltitudeWRTEllipsoid ); 
          wcscat(pwc2,wcpos);
        }
      } 
    }
    Wichtig ist, das der gps service zwei events abschickt (status und position), diese müssen in unserem
    wmEvent() abgefangen werden. Hier warten wir maximal 1000 ms = 1 sekunde auf einen dieser events.
    Code:
    switch (MsgWaitForMultipleObjects( 2, g_hGPSEvents, FALSE, 1000, QS_ALLINPUT))
    {
          case WAIT_OBJECT_0:
            gpsInfo( g_hGPS, &g_gpGPS, g_sInfo2, g_sInfo3 );
          break;
          case WAIT_OBJECT_0 + 1:
            gpsStatus(g_sInfo1);
          break;
    }
    Die anzeige der gps informationen wird in gpsutils.c->gpsInfo(...) erledigt.
    So siehts aus

    Den GPS empfänger startet (oder stoppt) man ,indem man rechts auf die plugin oberfläche klickt.

    Das aktuelle Today_Example_1.c
    Code:
    /* 05.03.2009 by nimodo 
     * Today Plugin Example 1
     */
    #include <windows.h>
    #include <tchar.h>
    #include <todaycmn.h>
    #include <aygshell.h>
    #include <regext.h>
    #include <gpsapi.h>
    
    /* libraries
     *  #pragma lib "aygshell.lib" 
     *  #pragma lib "coredll.lib" 
     *  #pragma lib "corelibc.lib"
     *  #pragma lib "gpsapi.lib" 
     */
    
    /* globals, prefix g_ or G_ means global for this file 
     */
    #define   G_APPLICATION_NAME  TEXT("Today_Example_1") 
    #define   G_INFOLINE_HEIGHT     24 /* Today plugin start height */
    #define   G_IDR_ICO_MAIN      8001 /* Icon Id in ressource file (.rc) */ 
    #define   G_ICON_WIDTH          16 /* Left icon width (#8001,... ) */
    #define   G_REG_ROOT          HKEY_LOCAL_MACHINE
    #define   G_REG_PATH_TEXTSIZE TEXT("ControlPanel\\Stylus\\192DPI")   
    #define   G_REG_VAR_TEXTSIZE  TEXT("CurFont")
    #define   WM_TEXTSIZE_CHANGED WM_USER + 1  /* Reg. notification event */
    
    HICON      g_hIcon       = NULL;   /* Left image - Icon Handle (.ico) */
    HINSTANCE  g_hInstance   = NULL;   /* This DLL Instance */ 
    HREGNOTIFY g_hNotify     = NULL;   /* Reg notification handle */
    WCHAR      g_sInfo1[80],           /* Content text  */
               g_sInfo2[80],g_sInfo3[80];
    BOOL       g_bRefresh1   = TRUE, g_bRefresh23 = TRUE;
    RECT       g_rUpdate1,g_rUpdate2,
               g_rUpdate3;             /* Only refresh this rectangle, not the whole plugin window */ 
    DWORD      g_TodayHeight = G_INFOLINE_HEIGHT; /* Todays height */
    DWORD      g_TextSize = 1000;       /* Default text size */    
    BOOL       g_AutoTextSize= TRUE;   /* Automatically adapt to system textsize */
    BOOL            g_bGPSOn   = FALSE;/* Is GPS service on or off */ 
    HANDLE          g_hGPS     = NULL; /* GPS service handle */                      
    GPS_POSITION    g_gpGPS;           /* ACtual GPS data */
    HANDLE          g_hGPSEvents[2];   /* Pos. and status events */
    
    /* these functions from GPSutil.c are used here
     */
    BOOL  gpsOpen(HANDLE *phdev, HANDLE *phevnp, HANDLE *phevns);
    BOOL  gpsClose(HANDLE hdev, HANDLE hevnp, HANDLE hevns);
    void  gpsInfo(HANDLE hdev, PGPS_POSITION pgp, WCHAR *,WCHAR * );
    DWORD gpsStatus(WCHAR *pwc);
    
    /* read startup settings from registry.
     */
    void Initialize(void)
    {
      HKEY  hk;
      DWORD bv, dws = sizeof(DWORD);
      /* Text size (Start->Settings->System->Screen->Textsize) */ 
      if ( g_AutoTextSize )
      {
       if ( ERROR_SUCCESS==RegOpenKeyEx( G_REG_ROOT ,G_REG_PATH_TEXTSIZE, 
                                       (DWORD)0, KEY_QUERY_VALUE, &hk) )
       {
          if ( ERROR_SUCCESS==RegQueryValueEx(hk, G_REG_VAR_TEXTSIZE, 
                                              NULL, NULL, (PBYTE)&bv, &dws ) )
          {
            g_TextSize = bv;
    		g_TodayHeight = 3*g_TextSize/100 + 4*3;
          }  
       }
       RegCloseKey(hk);
      } 
    }
    /* required custom entry for today-screen function
     * - must be declared in .def file with ordinal 240
     * - useful could be CustomItemOptionsDlgProc(...) ordinal 241 to 
     *   show an optional options dialog  */
    HWND APIENTRY InitializeCustomItem(TODAYLISTITEM *ptli, HWND hwndparent) 
    {
      HWND    hwnd;
      if ( 0==ptli->fEnabled )  return NULL; /* Disabled option in registry */  
      g_hInstance = ptli->hinstDLL;
      hwnd = CreateWindow (G_APPLICATION_NAME, G_APPLICATION_NAME, 
                           WS_VISIBLE|WS_CHILD, 
                           CW_USEDEFAULT, CW_USEDEFAULT, 
                           CW_USEDEFAULT, g_TodayHeight,
                           hwndparent, NULL, g_hInstance, NULL);  
      /* register a broker to get textsize changes in registry, 
         HRESULT return value should be used  */ 
      if ( g_AutoTextSize )
      {
        RegistryNotifyWindow(G_REG_ROOT,  G_REG_PATH_TEXTSIZE, G_REG_VAR_TEXTSIZE, 
                             hwnd, WM_TEXTSIZE_CHANGED, (DWORD)0, NULL, &g_hNotify); 
      }
      return hwnd;
    }
    
    /* main windows event handler - WNDCLASS.lpfnWndProc 
     */
    LRESULT WINAPI wmEvent(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
    {     
      DWORD h;
      /* catch gps events if gps service is on */
      if ( g_bGPSOn )  
      {
        switch (MsgWaitForMultipleObjects(2, g_hGPSEvents, FALSE, 1000, QS_ALLINPUT))
        {
          case WAIT_OBJECT_0:
           gpsInfo( g_hGPS, &g_gpGPS, g_sInfo2, g_sInfo3 );
           g_bRefresh23 = TRUE;
    	   g_TodayHeight = 3*g_TextSize/100+4*3;
          break;
          case WAIT_OBJECT_0 + 1:
           gpsStatus(g_sInfo1);
           g_bRefresh1 = TRUE;
    	   g_TodayHeight = 3*g_TextSize/100+4*3;
          break;
        }
      }
      else if ( g_bRefresh1==FALSE && g_bRefresh23==FALSE )
      {
         wcscpy(g_sInfo1,TEXT("GPS service is off"));
         g_sInfo2[0]='\0'; g_sInfo3[0]='\0';
         g_bRefresh1 = TRUE; g_bRefresh23 = TRUE;
      }
      /* std events */ 
      switch(msg)
      {
        case WM_TEXTSIZE_CHANGED:
          g_TextSize = (DWORD)wp; 
        break;
    
        case WM_PAINT:
        {
          PAINTSTRUCT ps;
    	  COLORREF    cr,crold;
          RECT        rc;
    	  HDC        hdc;  
          HFONT    hf, hsysf, holdf; 
          LOGFONT  lf; 
          /* get window rectangle of this plugin */    
          GetClientRect(hwnd, &rc);        
          /* start painting on screen */
          hdc = BeginPaint(hwnd, &ps);     
          /* transparent painting to preserve background  */
          SetBkMode(hdc,TRANSPARENT);
          /* draw icon at x,y (2,2)*/
          DrawIcon(hdc, 2, 2, g_hIcon);
          /* get system font */
          hsysf = GetStockObject(SYSTEM_FONT);
          GetObject(hsysf, sizeof(LOGFONT), &lf);
          lf.lfWeight = FW_NORMAL;
          lf.lfHeight = (LONG) -( (double)GetDeviceCaps(hdc, LOGPIXELSY)/72.0*g_TextSize/100.0);
          hf    = CreateFontIndirect(&lf);
          holdf = SelectObject(hdc, hf);
          SendMessage(GetParent(hwnd),WM_SETFONT,(WPARAM)hf,MAKELPARAM(TRUE,0));
          /* get today-screen system text color, and set it */ 
          cr    = SendMessage(GetParent(hwnd), TODAYM_GETCOLOR,TODAYCOLOR_TEXT, 0);
          crold = SetTextColor(hdc,cr);
    
          h = rc.bottom - rc.top;
          /* set rectangle where the texts should be drawn, save updating-rects */ 
          SetRect(&g_rUpdate1,rc.left+30,rc.top, rc.right, rc.bottom - 2*h/3);
          DrawText(hdc, g_sInfo1, wcslen(g_sInfo1), &g_rUpdate1, DT_SINGLELINE );       
    
          SetRect(&g_rUpdate2,rc.left+30,rc.top+h/3, rc.right, rc.bottom - h/3 );    
          DrawText(hdc, g_sInfo2, wcslen(g_sInfo2), &g_rUpdate2, DT_SINGLELINE );       
    
          SetRect(&g_rUpdate3,rc.left+30,rc.top+2*h/3, rc.right, rc.bottom );    
          DrawText(hdc, g_sInfo3, wcslen(g_sInfo3), &g_rUpdate3, DT_SINGLELINE );       
    
          /* stop painting & reset font settings */ 
          SelectObject(hdc, holdf);
          DeleteObject(hf);   
          SetTextColor(hdc,crold);
          EndPaint(hwnd, &ps);    
        }
        break;  
        /* catch this message to prevent background destroying, comes after 
         *  WM_PAINT  */
        case WM_ERASEBKGND:
        {
          TODAYDRAWWATERMARKINFO dwi;
          dwi.hdc = (HDC)wp;
          GetClientRect(hwnd, &dwi.rc);
          dwi.hwnd = hwnd;
          SendMessage(GetParent(hwnd), TODAYM_DRAWWATERMARK, 0,(LPARAM)&dwi);  
        }    
        break; 
        /* do some action depending where the stylus went up (see also WM_RBUTTONDOWN) */
        case WM_LBUTTONUP:
        {
          POINT pt;
          PROCESS_INFORMATION pi;
          pt.x = LOWORD(lp);  /* pt.y = HIWORD(lp); */
     	  /* On click left -> start today - settings - items */
          if ( pt.x <= G_ICON_WIDTH )
          {
            CreateProcess(TEXT("\\Windows\\ctlpnl.exe"), TEXT("cplmain.cpl,13,1"), 
                          NULL, NULL, FALSE, 0, NULL, NULL, NULL, &pi);
          }
          else 
          {
            if ( g_bGPSOn ) 
            {
               MessageBox(hwnd, L"Stop GPS service", L"GPS", MB_OK);
               g_bGPSOn = gpsClose(g_hGPS,g_hGPSEvents[0], g_hGPSEvents[1] );
            }
            else
            {
               MessageBox(hwnd, L"Start GPS", L"GPS", MB_OK);
               g_bGPSOn = gpsOpen(&g_hGPS, &g_hGPSEvents[0], &g_hGPSEvents[1]);
            }
          }
        }
        break; 
        /* Catch this mesage, to assure the content is updated - InvalidateRect */ 
        case WM_TODAYCUSTOM_QUERYREFRESHCACHE:
        {
          TODAYLISTITEM *ptli = (TODAYLISTITEM *)wp;
          if ( 0==ptli->cyp  )
    	  {
            ptli->cyp = g_TodayHeight;
            return 1;
      	  }
          else
          { 
            if ( g_bRefresh1 )
            {
              InvalidateRect(hwnd, &g_rUpdate1, TRUE);
              g_bRefresh1 = FALSE;
            }
            if ( g_bRefresh23 )
            {
              InvalidateRect(hwnd, &g_rUpdate2, TRUE);
              InvalidateRect(hwnd, &g_rUpdate3, TRUE);
              g_bRefresh23 = FALSE;
            }
            return 0;
          }
        }
        break;
        /* proceed to default windows event handler */
        default: 
    	return DefWindowProc(hwnd, msg, wp, lp) ;
      }
      return 0;	
    }
    
    /* main DLL entry function  
     */
    BOOL WINAPI DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
    { 
      switch (dwReason)   
      {
            case DLL_PROCESS_ATTACH:
                g_hInstance = (HINSTANCE)hModule;
                WNDCLASS     wc;
                memset(&wc, 0, sizeof(wc));
                wc.style         = CS_HREDRAW | CS_VREDRAW;
                wc.lpfnWndProc   = (WNDPROC)wmEvent;
                wc.hInstance     = g_hInstance;
                g_hIcon          = LoadIcon(g_hInstance, MAKEINTRESOURCE(G_IDR_ICO_MAIN)); 
                wc.hIcon         = g_hIcon;
                wc.hCursor       = NULL;
                wc.hbrBackground = (struct HBRUSH__*)GetStockObject(WHITE_BRUSH);
                wc.lpszClassName = G_APPLICATION_NAME;
                UnregisterClass(G_APPLICATION_NAME, g_hInstance);
                RegisterClass(&wc);
                Initialize();
                g_sInfo1[0]=g_sInfo2[0]=g_sInfo3[0]='\0';
            break;    
            case DLL_PROCESS_DETACH:
     		    UnregisterClass(G_APPLICATION_NAME, (HINSTANCE)hModule);
                DestroyIcon(g_hIcon);
                g_hIcon     = NULL; 
                g_hInstance = NULL;
                if (g_bGPSOn) 
                {
                  g_bGPSOn = gpsClose(g_hGPS,g_hGPSEvents[0], g_hGPSEvents[1] );
                }
                if (g_hNotify) RegistryCloseNotification(g_hNotify);
                g_hNotify   = NULL;
                g_sInfo1[0]=g_sInfo2[0]=g_sInfo3[0]='\0';
            break;
      }
      return TRUE;
    }
    mfg - nimodo
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)-tde_1.jpg  
    Angehängte Dateien Angehängte Dateien
    3
     

  5. Unregistriert Gast
    Hi Nimodo,

    sehr interessanter Artikel, besonders das Endergebnis mit GPS display interessiert mich sehr.
    Ich habe noch ein kleines Problem:

    Die Darstellung im Todaybildschirm ist von der Höhe etwa das Bild, und es werden von 2 Textzeilen nur das jeweils oberste 6tel oder so angezeigt.

    Das ist unter Windows Mobile 6.1


    Viele Grüße,

    Ingo
    0
     

  6. 22.04.2009, 22:05
    #6
    Hast du die DLL (aus meinem zip in beitrag 3) ausprobiert, oder die sourcen rekompiliert ?
    Schau mal, ob du eine Variable "CurFont" in "ControlPanel\\Stylus\\192DPI" hast auf deinem handy.


    mfg - nimodo
    0
     

  7. Unregistriert Gast
    Hallo Nimodo,

    selbstkompiliert, und der Reg-Key war das Problem, bei mir gab es nur einen für 96 dpi.
    Ach ja, diesen "Danke" Button, muss man dafür angemeldet sein? Ich finde ihn so nicht.


    Danke!

    Ingo
    0
     

  8. Ja, für Danke muss man angemeldet sein. Sonst kann das System den Dank nicht zuordnen
    0
     

  9. Hallo,

    ich habe mir mal nach dieser Anleitung ein Today-Plugin gebastelt was auch funktioniert.

    Das einzige Problem was ich damit habe ist, dass es nach einem neustart (Soft Reset) nicht angezeigt wird.
    Entferne ich einmal den Haken in den Today-Einstellungen und setze ihn wieder wird es angezeigt.

    Kann mir evtl. jemand einen Tipp geben woran das liegen könnte?
    Danke.
    0
     

  10. 02.05.2009, 22:45
    #10
    Hmm
    1) ist HKEY_LOCAL_MACHINE\Software\Microsoft\Today\Items\...\Enabled vor und nach Softreset 1 ?
    2) Welches Handy ? Betriebssystem ? ROM ?

    Beschreib mal präzise den Vorgang, der zu dem Problem führt.

    mfg - nimodo
    0
     

  11. Hallo,

    Gerät: HTC Touch HD
    ROM : 1.14.207.2(24011) GER (original ROM)
    ROM2: 1.56.401.0(43972) WWE
    BS : Windows Mobile 6.1

    Lag scheinbar am ROM. Mit dem neuen ROM (ROM2) wird es jetzt meist nach einem Neustart angezeigt.

    Im Grunde ist das ja kein Großes Problem, da im Normalfall das Gerät nicht neu gestartet wird oder nur sehr selten.
    Nur jetzt wo es neu ist probiere ich einiges aus und da kann es schon mal vorkommen das es mehrmals am Tag neu gestartet werden muss.

    Gruß
    zerodeath
    1
     

  12. Unregistriert Gast
    Hallo Nimodo,

    tolle Arbeit mit dem Plugin! Vielen Dank soweit mal dafür! Die Anzeige auf den Heute-Bildschirm fumktioniert zwar, aber leider bekomme ich da keine GPS Daten angezeigt. Funktioniert das Tool nur mit integriertenGPS-Empfägnern auch wenn ein Externer als intern vorgegaukelt wird?

    Thanks schonmal für die Mühe!

    Comethoschi
    0
     

  13. es gibt eigentlich keinen Unterschied zwischen Internen und externen GPS-Emfpängern. Beide werden über serielle Schnittstellen angesprochen, ganz egal, wo die sind.
    0
     

  14. Unregistriert Gast
    Morgen zusammen,

    hab noch ein wenig weitergesucht was die Kommunikation zwischen GPS und Windows herstellt. Dabei bin ich über diverse Registry-Einträge gestolpert, die für das Funktionieren des Aufrufs "dwServiceState" in der GPSutils.c notwendig sind :

    (Quelle: msdn Windows Enbedded Developer Center)
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\GPS Intermediate Driver\Drivers\XY-GpsHardware (letzteres ist ein Platzhalter!!!)

    Vielleicht könntet Ihr dort mal einen Blick reinwerfen und mir eine Idee davon geben was drinstehen muss!? Oder ist bei Euch kein Eintrag vorhanden?
    Sonst irgendwelche Ideen?

    Gruß
    comethoschi
    0
     

  15. Das hängt wohl der GPS Hardware ab. Welches Gerät denn?
    beim Touch Diamond2 steht da der Schlüssel GPSOneDevice:
    CommPort=GPS0
    DriverName=GPS Device Driver
    FirendlyName=QualComm GpsOne Card, version 0.0
    InterfceType=POLL
    PollInterval=0x3E8
    Version=0x2
    0
     

  16. Unregistriert Gast
    Also das Gerät ist ein HTC Wizard mit WM6.1 in Verbindung mit einem Bluetooth GPS Receiver der über eine serielle Schnittstelle angesprochen wird. Bei mir ist das COM5.
    In der Registry steht jetzt:

    CommPort=COM5
    DriverName=GPS Device Driver
    CurrentDriver=IBlueGPS
    FirendlyName=iBlue Bluetooth GPS receiver
    InterfceType=POLL
    PollInterval=1000

    leider alles ohne Erfolg - sollte noch jemand Ideen haben... ich bin Dankbar für jeden Input!

    Gruß
    Comethoschi
    0
     

  17. Unregistriert Gast
    Heureka... aber da muss man doch ziemlich auf Feinheiten achten!

    Registry:
    HKLM/System/CurrentControlSet/GPS Intermediate Driver/Drivers/
    CurrentDriver=iBlueGPS (Name des Reg-Verzeichnisses mit den Einstellungen)

    HKLM/System/CurrentControlSet/GPS Intermediate Driver/Drivers/iBlueGPS Das Verz.
    CommPort=COM5: (DerDoppelpunkt machte den Unterschied!)
    InterfceType=COMM (Bei COM-Ports nicht POLL!!!)
    FriendlyName=Name unwichtig, wird aber im Plugin Angezeigt
    DriverName=GPS Device Driver (Hab ich nicht damit experimentiert)

    Zusätzlch habe ich nun noch einen automatischen GPS-Portsplitter benutzt um die Daten auch noch im Navi unter COM5 nutzen zu können.

    Hoffe das hilft auch mal irgendwem weiter!

    Vielen Dank dennoch für die Hilfe, bis mal wieder!
    Comethoschi
    0
     

  18. CometHoschi Gast
    Hallo Zusammen,

    ich habe nochmals eine Frage... die angezeigte Geschwindigkeít kommt mir für km/h sehr langsam vor. Ist es möglich dass die Ausgabe in Nautischen Meilen (=1.852 km) erfolgt? Oder stecke da noch was ganz anderes dahinter? Der Faktor würde zumindest in etwa passen.

    Grüße und Danke!
    CometHoschi
    0
     

  19. 29.05.2009, 18:49
    #19
    das ist richtig,es sind knoten nicht km/h

    mfg nimodo
    Von meinem mobile Device aus eingetragen
    1
     

  20. Unregistriert Gast
    Hi echt gute Idee...
    ich wollte euch mal fragen ob ihr mir ein grundgerüst für eine Programmverknüpfung erstellen könnt?!
    ich habe schon versucht die aktuelle "version" von nimodo zu ändern aber ich bekomme es nicht hin, da ich sehr unerfahren bin...
    Wäre auch net wenn mir jemand erklären könnte wie ich das icon an die verknüpfung anpassen kann!
    Vielen dank im Vorraus
    0
     

Seite 1 von 2 1 ... LetzteLetzte

Ähnliche Themen

  1. Clock Only Today Screen
    Von bedorHD im Forum Touch HD Interface
    Antworten: 8
    Letzter Beitrag: 08.03.2009, 08:46
  2. today-plugin auslastung speicher als cab gesucht
    Von touchberry im Forum Software (Touchscreen)
    Antworten: 2
    Letzter Beitrag: 09.10.2008, 21:06
  3. today plugin
    Von bedi im Forum Plauderecke
    Antworten: 1
    Letzter Beitrag: 13.09.2008, 08:24
  4. Shortcuts als Today Plugin
    Von MrBorland im Forum Plauderecke
    Antworten: 2
    Letzter Beitrag: 11.03.2004, 12:46

Besucher haben diese Seite mit folgenden Suchbegriffen gefunden:

windows mobile today screen

windows mobile today

windows mobile today plugin

today screen plugin

windows mobile heute bildschirm

windows mobile heute plugin

windows mobile today plugins

bildschirm

today windows mobile

today screen

windows mobile home

today plugin windows mobile

windows mobile today screen plugins

windows mobile 6.1 today screen plugins

windows mobile 6.5 today screen

windows mobile today screen plugintoday screen pluginswindows mobile heuteheute bildschirm windows mobiletoday screen windows mobile 6.5today screen windows mobilewindows mobile heute bildschirm anpassenAYGSHELL.DLLwm6.5 heuteToday.dll

Stichworte