-
Liste der Anhänge anzeigen (Anzahl: 3)
Windows Mobile Heute-Bildschirm / Today-Screen Plugin (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 aussehenhttp://www.pocketpc.ch/attachments/p...xample_1_a.jpg
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
-
Liste der Anhänge anzeigen (Anzahl: 1)
System textgrösse, Registry
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
-
Noch zur registry
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, ...).
-
Liste der Anhänge anzeigen (Anzahl: 2)
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
http://www.pocketpc.ch/attachment.ph...9&d=1236983122
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
Ja, für Danke muss man angemeldet sein. Sonst kann das System den Dank nicht zuordnen :)
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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.
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
es gibt eigentlich keinen Unterschied zwischen Internen und externen GPS-Emfpängern. Beide werden über serielle Schnittstellen angesprochen, ganz egal, wo die sind.
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
das ist richtig,es sind knoten nicht km/h
mfg nimodo
Von meinem mobile Device aus eingetragen
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
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
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
Hallo,
ich habe das Heute-Plugin ausprobiert. Dazu habe ich die gezippten Dateien (Projekt / fertige DLL) entpackt.
Wenn ich die TodayExample_1.dll direkt benutze, dann klappt's. Wenn ich das Projekt neu kompiliere, klappt's nicht.
Im Heute Dialog wird das Plugin nicht angezeigt.
Was könnte das Problem sein ?
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
Hm, ist lange her... ;) Ich kanns leider nicht mehr ausprobieren.
Schau mal, obs funktioniert, wenn im PellesC, Projekt -> Projektoptionen... -> Compiler Tab die Optimierungen ausgeschaltet sind.
mfg - nimodo
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
hallo, ich habe versucht, das project genauso wie im 1. beitrag dargestellt umzusetzen. ich habe auch versucht, die zipdatei zu instalieren. leider alles ohne erfolg. liegt es an meinem win 6.5.3? oder muss ich in der reg noch etwas ändern? hat vielleicht noch jemand erfahrung damit?
-
Welche IDE und welches SDK?
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
mit pelles c 6.0 32bit und der add-in sdk 32 bit. er hat auch anstandslos compiliert.
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
ich werde heute abend den vorschlag von nimodo probieren.
-
AW: Windows Mobile Heute-Bildschirm / Today-Screen Plugin (1)
ich habe die original .dll aus der zip datei auf meinem alten glofiish mit wm 5 zum laufen bekommen. liegt vielleicht am wm 6.5.3 ...
titatnium hatte ich natürlich deaktiviert.