Blog Home  Home Feed your aggregator (RSS 2.0)  
Peter Nowaks Mobile Blog
Mobility on the Run
 
 Monday, January 25, 2010
Nachdem einige MVPs das Wochenende verbrachten, indem Sie ihre Installationen korrigierten, nachdem die Installation des Windows Mobile 6.5 SDKs ein Durcheinander anrichtete, ist nun vorübergehend die Downloadseite nicht erreichbar.
Wie es aussieht möchte man sich anscheinend dem Problem widmen.

Monday, January 25, 2010 6:29:26 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   .NET Compact Framework  |  Trackback
 Saturday, January 23, 2010
Normalerweise erfolgt vor einem Release eine neuen Software irgendeine Form einer Ankündigung. Nicht so beim Windows Mobile 6.5 SDK, welches seit dem 22.1.2010 als Download verfügbar ist.[Update] Mehrere MVPs verbrachten das Wochenende ihre Systeme neu aufzusetzten, nachdem die SDK Installation einige Fehler verursacht.[/Update]
Dieses scheint das bisher verfügbare DTK abzulösen.
Leider hatte ich noch keine Zeit es mir anzuschauen, so dass ich hier nur das wiedergeben kann, was ich bisher darüber im Netz gefunden habe.
Das SDK gibt es, wie bei früheren Versionen auch, klassisch für Classic (ohne Touchscreen) als auch für Professional (mit Touchscreen) Geräte.

Die einzelnen Downloadpakete stehe für die folgenden Sprachen zur Verfügung:
  • 0804 CHS Chinese Simplified
  • 0409 USA English
  • 0407 GER German
  • 040c FRA French
  • 0410 ITA Italian
  • 0c0a ESN Spanish
  • 0411 JPN Japanese
Neben zusätzliche Dokumentation, Beispielen und Headerfiles beinhaltet es noch die Emulatorimages, wie auch Erweiterungen für Visual Studio 2008. Visual Studio 2010 wird, wie bekannt, nicht unterstützt.
Eine der Visual Studio Erweiterungen ist für das Erstellen und Debuggen von Widgets. Nick Randolph, MVP für Device Application Development hat bereits einen Post zu diesem Thema veröffentlicht.

[Update]

Peter Foot berichtet via Facebook, dass es sich bei den Emulatorimages um Windows Mobile in der Version 6.5.3 handelt.
Darüber hinaus scheint es so, dass das Windows Mobile 6 SDK vor der Installation des neuen SDKs deinstalliert werden sollte. Der Grund hierfür ist, dass ansonsten alle anderen Plattformen und Emulator Images aus dem Visual Studio verschwinden. Auch sind diese dann anscheinend nicht mehr im Device Emulator Manager vorhanden.

Saturday, January 23, 2010 9:41:50 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [1]   .NET Compact Framework | Windows Mobile  |  Trackback
 Friday, January 15, 2010

Wie es zu erwarten war, ist die Entwicklecommunity hinsichtlich Multitouch aktiv. So gibt es mittlerweile eine .NET CF Bibliothek von einem Entwickler namens SciLor, wodurch eigene Anwendungen Multitouch unterstützen können.

Zwar ist die Entwicklung noch in den Kinderschuhen – ein erster Schritt ist jedoch getan.

Die Bibliothek, sowie ein paar Samples finden sich hier.

Friday, January 15, 2010 9:40:35 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   .NET Compact Framework | .NET Compact Framework 3.5 | Windows Mobile  |  Trackback
 Thursday, January 14, 2010

Wer aktuell versucht mobile Anwendungen oder Installationsdateien mit den Zertifikaten des Windows Mobile SDKs zu signieren erlebt eine kleine böse Überraschung: Die Zertifikate sind nicht mehr gültig.
Der Grund hierfür liegt darin, dass die Zertifikate mit dem 31.12.2009 abgelaufen sind.

Aus diesem Grund wurden neue Zertifikate im Windows Mobile Blog zur Verfügung gestellt. Zu finden sind diese mit entsprechenden Installationsanleitungen hier: http://windowsteamblog.com/blogs/wmdev/archive/2010/01/12/new-windows-mobile-developer-certificates.aspx

Thursday, January 14, 2010 6:47:26 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   .NET Compact Framework | .NET Compact Framework 3.5 | Visual Studio | Windows Mobile  |  Trackback
 Friday, January 01, 2010
Ich wünsche allen Lesern ein frohes neues Jahr und hoffe, daß alle die Feiertage gut überstanden haben. Auch ich habe diese Tage sehr genossen und im Kreise der Familie und Freunde mich gut erhohlt.

Den ersten Blogpost nehme ich daher auch zum Anlass meine Gedanken zum letztem Jahr und zum eben angefangenen zu äussern.

Was war

2009 war ein durchwachsenes Jahr.
Als ich zum ersten Mal einen Blick auf Windows Mobile 6.5 werfen durfte, war mein erster Gedanke "Das kann doch nicht deren Ernst sein...". Ich tat mich anfangs sehr schwer damit, das neue Windows Mobile zu mögen. Doch der Eindruck änderte sich.
Viele gehen heute immer noch davon aus, daß 6.5 der "iPhone Killer" ist. Das war jedoch nie der Gedanke bei dieser Version, weswegen ich mir für dieses Jahr wünsche, hierüber nicht mehr über dieses Thema diskutieren zu müssen, wie ich es beispielsweise letztes Jahr auf der TechEd in Berlin zu Genüge tat.
Es ging bei 6.5 immer darum, eine verbesserte Bedienung zu bieten; nach Möglichkeit ohne Stift und am Besten mit dem Daumen.
Der neue "Heute-Bildschirm" alias CHome hat dies als Erstes gut ermöglicht. Zwar kann man offiziell keine Plugins hierfür selbst erstellen, doch findet man im Internet einige Beschreibungen, wie es doch geht. Die neuen und größeren Menüs sind auch sehr sinnvoll.
Die Gesture API, mittlerweile auch durch diverse gute Wrapper im managed Code möglich, ermöglicht es mittels Programmierung auch, diese Schnittstelle in seiner eigenen Anwendung zu verwenden und sie somit aufzupepppen.
Da das System jedoch erst spät im Jahr zur Verfügung stand, wo Simon Hackfort, Patrick Getzmann und ich auch in unserer zugehörigen Webcastserie die Neuerungen vorgestellt haben, nahmen wir das erste Halbjahr eher dazu Best Practices in einer anderen Webcastserie darauf einzugehen.
Diejenigen, die nicht genug von der Enttwicklung für Windows Mobile und Windows Embedded CE bekommen konnten, trafen sich Anfang Dezember auf der MobileGuru konferenz. Hier wurden neben Einsteigerthemen auch Themen behandelt, welche selbst für mich neu waren und ich mir diese Session somit gerne angesehen habe.
Kurz zusammengefasst: 2009 war für mich neben Windows Mobile 6.5 das Jahr, wo es darum galt sich mit aktuellen Technologien zu beschäftigen, als auch zu schauen, was die anderen Hersteller aktuell machen.

Was wird

Anderen Systeme haben aufgeholt: Android scheint langsam erwachsen zu werden - das iPhone OS kann ztem Jahr auch endlich Copy & Paste. ;-)
Ich denke, dass bbei Android dieses Jahr noch viel gefeilt werden wird. Beim iPhone mag ich jedoch keine Prognose machen. Zwar hört man Gerüchte, dass dieses Jahr ein neues 4G Gerät kommen soll was wesentliche Hardwareverbesserungen haben soll doch sehe ich persönlich aktuell nicht, wohin es mit dem OS gehen soll. Es hat zwar Detailverbesserungen bis zur Version 3.0 erfahren und wurde aufpoliert. Doch auch das System wird alt - das Basisbetriebssystem hat sich gegenüber der ersten Version nur marginal verändert. Ich höre immer öfter, dass viele Personen im privatem Umfeld auf andere Geräte umsteigen; Firmen begreifen auch immer öfter, dass das iPhone im Consumerbereich angesiedelt ist und für den Businessbereich nur in einem bestimmten Umfang geeignet ist.
Viel interessanter finde ich da den Umstand, dass man seitens Microsoft nichts konkres zu einem Nachfolger hört. Es wird zwar mit Hochdruck daran gearbeitet und es soll riesig werden - mehr Informationen gibt es jedoch nicht.
Bleibt abzuwarten, wann und was man dazu hören wird.
Wer letztes Jahr nicht an der MobileGuru konferenz teilnehmen konnte, wird wahrscheinlich im 2. Halbjahr diesen Jahres eine Chance haben.

2010 hat jedoch bereits super angefangen. Ich freue mich sehr, dass es neben Torsten Weber und mir seit heute einen neuen Device Application Development MVP insbesondere für native Code in der DACH-Region gibt: Patrick Getzmann. Herzlichen Glückwunsch Patrick. Es freut mich sehr.

So viel zu meinem persönlichen Rückblick und einer kleinen Vorschau auf dieses Jahr.

Ich wünsche daher nochmal allen Lesern ein frohes neues Jahr und hoffe, dass wir alle dieses Jahr wieder interessantes erleben werden.
 

Friday, January 01, 2010 10:59:56 PM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   Personal  |  Trackback
 Thursday, December 24, 2009
Sollte man die Weihnachtsgeschenke für seine Lieben bereits gekauft haben, so kommt man meist zum eher unangenehmen Teil: Dem Verpacken.
Dies gilt jedoch auch für Anwendungen, die auf einem mobilen Gerät installiert werden sollen. Hierfür gibt es das CAB-Datei Format.
 
Um eine entsprechende Installationsdatei zu erstellen, nehmen wir einmal an, dass wir die zu verpackenden Dateien unter c:\HelloWorld abgelegt haben.
Die Dateien, welche dort vorliegen müssen, sind die HelloWorld.exe, welche installiert werden soll, sowie die HelloWorld.inf Datei, welche die Informationen für den CabWizard vorbehält, um eine CAB-Datei erzeugen zu können.


Hier nun der Inhalt der INF-Datei dazu. Hierbei hat die Programmiersprache diesmal keine Relevanz:

[SOURCE FILE]
Name=CHelloWorld.cab
Path=C:\HelloWorld\HelloWorld.cab
AllowUninstall=TRUE

[Version]
Signature="$Chicago$"
CESignature="$Windows CE$"
Provider="Company"

[CEStrings]
AppName="HelloWorld"
InstallDir="%CE1%\CHelloWorld"

[CEDevice]
ProcessorType=0
VersionMin=0.0
VersionMax=0.0
BuildMin=0
BuildMax=0

[SourceDisksNames]
1=,Source1,,

[SourceDisksFiles]
"HelloWorld.exe"=1

[CopyFiles1]
"HelloWorld.exe",,,0x00000001

[DestinationDirs]
CopyFiles1=0,"%CE1%\HelloWorld"

[DefaultInstall]
CopyFiles=CopyFiles1


Wird nun auf der Kommandozeile der Befehl "c:\Program Files\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\cabwiz.exe" "Company HelloWorld2.inf" ausgeführt (Pfad ist natürlich hinsichtlich seinen Gegebenheiten anzupassen), so findet sich im entsprechenden Zielordner die CAB-Installationsdatei wieder.
Weitere Informationen zum CAB-Wizard erhalten Sie hier:http://msdn.microsoft.com/de-de/library/cc433670%28VS.71%29.aspx


Das war es mit dem Adventskalender für dieses Jahr und wünschen Ihnen ein frohes Fest.

Patrick & Peter

Thursday, December 24, 2009 9:34:40 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   WMDevAdventskalender09  |  Trackback
 Wednesday, December 23, 2009
So kurz vor weihnachten sollte der Weihnachtsbaum hell leuchten. Warum auch nicht dann die LED des Bluetoothmoduls des Gerätes zum Blinken bringen?
Nichts einfacher als das, in dem man das Bluetooth Modul aktiviert.

Dabei gilt zu beachten, dass dieses Beispiel nur auf Geräten funktioniert, die den Microsoft Bluetooth Stack verwenden.

C++

#include "bthutil.h"
#pragma comment(lib, "Bthutil.lib")

...

DWORD dwMode = 0;
BthGetMode(&dwMode);
if(dwMode==BTH_POWER_OFF || dwMode==BTH_CONNECTABLE)
{
    BthSetMode(BTH_DISCOVERABLE);
}



C#

In C# ist es auch an dieser Stelle nötig, mittels P/Invoke auf die nötige DLL zu zu greifen, um auf die entsprechenden Informationen zu erhalten.
Somit hier das Snippet:

...
public enum RadioMode
{
    Off = 0,
    Connectable = 1,
    Discoverable = 2
}

static class Program
{
    [DllImport("BthUtil.dll")]
    private static extern int BthGetMode(out RadioMode dwMode);

    [DllImport("BthUtil.dll")]
    private static extern int BthSetMode(RadioMode dwMode);

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [MTAThread]
    static void Main()
    {
        RadioMode rm = RadioMode.Off;
        BthGetMode(out rm);
        if (rm == RadioMode.Off || rm== RadioMode.Connectable)
        {
            BthSetMode(RadioMode.Discoverable);   
        }
    }
}
...


Patrick & Peter

Wednesday, December 23, 2009 12:09:00 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   WMDevAdventskalender09  |  Trackback
 Tuesday, December 22, 2009
In vielen Fenstern und Wohnungen findet man zur Weihnachtszeit eine ganze Menge an Lichterketten und sonstiger beleuchteter Weihnachtsdekoration.
Das manuelle Einschalten dieser vielen Lichterketten und Lämpchen kann eine zeitraubende Beschäftigung werden.
Gleiches gilt auch für Windows Mobile Applikationen die durchgehend laufen sollen. Wenn der Anwender diese Applikationen manuell starten muss dauert dies natürlich auch eine Weile.
Wäre es nicht angenehmer wenn dies automatisch geschehen würde?
Mit folgendem Codeschnipsel kann aus der eigenen Anwendung heraus, beispielsweise per Optionsdialog, eine Autostartverknüpfung angelegt werden.

C++

//Dies ist eigentlich das gleiche Schnipsel wie Türchen Nummer 8
//jedoch wird diesmal die CSIDL_STARTUP verwendet.
//Autostart Ordner auslesen
WCHAR szShortcutPath[MAX_PATH*2] = L"\0";
SHGetSpecialFolderPath(NULL,szShortcutPath,CSIDL_STARTUP,0);
wcscat(szShortcutPath,L"\\MeinShortcut.lnk");
//Modulnamen auslesen
WCHAR szModulePath[MAX_PATH*2] = L"\0";
GetModuleFileName(GetModuleHandle(NULL), szModulePath, MAX_PATH);
//Shortcut erstellen
SHCreateShortcut(szShortcutPath,szModulePath);



In C# ist es diesmal nicht notwendig P/Invoke zu nutzen, um an diese Informationen zu kommen. Die Klasse Environment hierfür reicht völlig.
Hier also das Snippet:

C#

...
[DllImport("coredll.dll")]
private static extern int SHCreateShortcut(StringBuilder szShortcut, StringBuilder szTarget);
...
[MTAThread]
static void Main()
{

   StringBuilder shortcut = new StringBuilder(System.Environment.GetFolderPath(Environment.SpecialFolder.Startup)+@"\MeinShortcut.lnk");
   StringBuilder target = new StringBuilder(@"\windows\calc.exe");
   SHCreateShortcut(shortcut, target);
}
...


Patrick & Peter

Tuesday, December 22, 2009 9:01:04 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   WMDevAdventskalender09  |  Trackback
 Monday, December 21, 2009
Der große Vorteil eines digitalen Adventskalenders ist, dass man volle Kontrolle über alle Türchen
hat und niemand vorab schon mal die "24" öffnen kann.
Eine vollständige Kontrolle bspw. über sämtliche Tasten kann auch mal in einer Windows Mobile Applikation benötigt werden.
Das folgende Codeschnipsel zeigt wie man dies mit der AllKeys API bewerkstelligen kann.

C++

//Alle Tasten abfangen(bspw. in WM_CREATE)
AllKeys(TRUE);

...

//In WM_KEYDOWN und WM_KEYUP den WPARAM prüfen.
//Siehe http://msdn.microsoft.com/en-us/library/bb431750.aspx für Keycodes
case WM_KEYDOWN:
    OutputDebugString(L"WM_KEYDOWN\n");
    //Behandlung für den Tastencode ist hier nicht aufgeführt
    HandleKey(wParam);
    break;
case WM_KEYUP:
    OutputDebugString(L"WM_KEYUP\n");
    //Behandlung für den Tastencode ist hier nicht aufgeführt
    HandleKey(wParam);
    break;

...




Im verwaltetem Code ist es mehr Code nötig, um das gleiche Ziel zu erreichen. Das liegt daran, dass eine Windows Form generell die Verarbeitung von derlei Nachrichten intern bereits durchführt.
Um also auf die internen Window Messages zugreifen zu können, ist es nötig, eine Klasse zu erstellen, die von der Klasse MessageWindow ableitet. Zusätzlich ist auch das P/Invoke notwendig, um die AllKeys-Methode auf zu rufen.
Somit ist es diesmal für das Snippet nötig, eine Anwendung für intelligene Geräte anzulegen, welche eine Geräteanwendung darstellt.
Der Code is dann entsprechend ähnlich abzuändern:

C#

...
using Microsoft.WindowsCE.Forms;
...

public partial class MessageForm : Form
{
    [DllImport("coredll.dll", SetLastError = true)]
    static extern bool AllKeys(bool bAllKeys);
    
    MsgWindow msgWin;

    public MessageForm()
    {
        InitializeComponent();
        AllKeys(true);
        msgWin = new MsgWindow(this);
    }

...

}
...
public class MsgWindow : MessageWindow
{
    public const int WM_KEYDOWN = 0x0100;
    public const int WM_KEYUP = 0x0101;


    private MessageForm msgform;

    public MsgWindow(MessageForm msgform)
    {
        this.msgform = msgform;
    }

    protected override void WndProc(ref Message msg)
    {
        switch (msg.Msg)
        {
            case WM_KEYDOWN:
                MessageBox.Show("Key was down with WPARAM:" + ((int)msg.WParam).ToString() + "and LPARAM:" + ((int)msg.LParam).ToString());
                break;
            case WM_KEYUP:
                MessageBox.Show("Key was up with WPARAM:" + ((int)msg.WParam).ToString() + "and LPARAM:" + ((int)msg.LParam).ToString());
                break;
        }
        base.WndProc(ref msg);
    }
}


Mehr Informationen zur Klasse MessageWindow erhalten Sie hier:

http://msdn.microsoft.com/de-de/library/microsoft.windowsce.forms.messagewindow%28VS.80%29.aspx



Patrick & Peter

Monday, December 21, 2009 12:41:07 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   WMDevAdventskalender09  |  Trackback
 Sunday, December 20, 2009
Gerade in der Weihnachtszeit sind die Schaufenster derart mit Werbung oder Kunstschnee zugekleistert, das der Blick auf die schönen Dinge dahinter verwehrt ist.
Auch dies gilt für manche Windows Mobile Anwendung, die man im Vollbildmodus betreiben möchte.

C++

//Der folgende Code gilt für Win32 Anwendungen.
//Er ist im IDM_HELP_ABOUT Handler der WM_COMMAND Nachricht
//einer per Visual Studio 2008 Win32 Projekt für intelligente Geräte (Windowsanwendung)
//untergebracht. Der DialogBox Aufruf ist auskommentiert.
//Rückgängig gemacht werden sollte der Fullscrenn Code bspw. über ein Kontextmenu oder beim
//beenden der Applikation
//DialogBox(g_hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, About);
//Fenster muss für SHFullScreen im Vordergrund sein
SetForegroundWindow(hWnd);
//SIP und Taskbar in den Hintergrund legen
SHFullScreen(hWnd,SHFS_HIDESIPBUTTON|SHFS_HIDETASKBAR);
//Die Menübar soll auch weg
HWND hwndMenu = SHFindMenuBar(hWnd);
//Erst die Menübarhöhe holen. Gilt auch für das Starmenü
RECT rcMenue;
GetWindowRect(hwndMenu, &rcMenue);
//Menübar verschieben
SetWindowPos(hwndMenu, NULL,-1, -1,0, 0,SWP_NOZORDER | SWP_NOACTIVATE);
//Jetzt muss unser Fenster noch neu positioniert werden
RECT rect;
GetWindowRect(hWnd,&rect);
rect.top -= rcMenue.bottom - rcMenue.top;
rect.bottom += rcMenue.bottom - rcMenue.top;
MoveWindow(hWnd,rect.left,rect.top,rect.right,rect.bottom,TRUE);




C#

Eine Anwendung zu erstellen, welche eine Vollbilddarstellung liefert ist mit Bordmitteln des .NET Compact
Frameworks bereits einfach realisierbar.
Dies geht sogar so einfach, dass nicht einmal ein Snippet hierfür notwendig ist.
Setzen Sie für die Vollbilddarstellung Ihrer Form einfach die zugehörige Eigenschaft WindowsState auf den
Wert FormWindowState.Maximized. Hierdurch »verschwindet« die Titelzeile Ihrer Anwendung.
Damit sich jedoch kein vielleicht im Hintergrund startendes Programm in den Vordergrund setzt und Ihre
Anwendung überlagert, sollten Sie gleichfalls die Eigenschaft TopMost der Form auf den Wert true setzten.
Wollen Sie gleichfalls die Menüzeile, welche Ihr Anwendungsmenü darstellt und meist auch die virtuelle
Tastatur aktiviert, deaktivieren, ist auch dies ganz einfach. Leider gibt es für das MainMenu keine Eigenschaft
»Enabled«, um dies zu ermöglichen. Stattdessen reicht es, wenn die Eigenschaft Menu der zugehörigen Form auf
den Wert null gesetzt wird, was auch dynamisch aus der Anwendung möglich ist.
Hierdurch wird die Zuweisung eines MainMenu zur Form entfernt, wodurch Sie eine komplette
Vollbilddarstellung Ihrer Anwendung erhalten. Wenn Sie nun Menu wieder das Objekt vom Typ MainMenu
zuweisen, haben Sie wieder Ihren Ursprungszustand hergestellt.

Patrick & Peter

Sunday, December 20, 2009 10:29:28 AM (W. Europe Standard Time, UTC+01:00)  #    Comments [0]   WMDevAdventskalender09  |  Trackback
Copyright © 2010 Peter Nowak. All rights reserved.
DasBlog 'Portal' theme by Johnny Hughes.