Email to Torsten Weber
Feed Icon
.NET User Group Leipzig

Aktualisierung: Dem Entwickler von phoneAlarm hat dieser Blogeintrag bzw. Vorschlag gefallen. In Version 2 soll diese Funktionalität in phoneAlarm enthalten sein. Ein SDK habe ich auch gleich noch vorgeschlagen... :)
---

Leider unterstützt Windows Mobile von Haus aus keine Profile. Profile meint, dass z. B. während der Zeit von 23 Uhr - 6 Uhr ein mobiles Gerät weder auf Anrufe noch auf SMS bzw. MMS durch irgendetwas an Tönen aufmerksam machen soll. Es soll also still sein und GSM könnte während dieser Zeit gleich auch noch deaktiviert sein. Am nächsten Morgen soll dann automatisch alles zurückgesetzt und GSM wieder aktiviert werden. "Normalerweise" müsste bei Windows Mobile hier wieder die PIN eingegeben werden, aber ist das eine gute User Experience?

Eine Anwendung, die Profile unterstützt und das sogar gut, ist phoneAlarm von pocketMax. Sehr gut deswegen, weil sich Profile mit Standorten verknüpfen lassen. Verlässt man z. B. den Einflussbereich von Funkzellen, die Zuhause in der Nähe sind, könnte automatisch auf das Profil Geschäftlich geschaltet werden. Erreicht man die Funkzellen Zuhause wieder, dagegen zurück aufs Profil Zuhause. Unabhängig davon können Profile automatisch geschaltet werden, z. B. wenn im Terminkalender ein Termin einer bestimmten Kategorie steht. Ist die Kategorie beispielweise Besprechung wird eben auf Stumm aber mit Vibrationsalarm während dieses Zeitraumes geschaltet. phoneAlarm bietet unglaublich viele Variationen durch vielfältige Einstellungsmöglichkeiten. Das ist User Experience! Wer seinen Terminkalender pflegt, muss nie wieder darüber nachdenken, welches Profil gerade am besten an sein sollte. Die Profile lassen sich auch manuell wählen und zusätzlich dazu der Ton abschalten mittels "Ton aus bis".

Funktionsweise von phoneAlarm

Microsoft – change the mobile world or go home! Für mich persönlich ist bei mobilen Geräten schon nervig, dass eine Synchronisation in Abhängigkeit vom Standort nicht von Haus geht. Lösungen für Kunden habe ich schon entwickelt, durchaus auch sehr komplexe, aber etwas Einfaches für die Endanwender fehlt. O. k., we change the mobile world or go home!; und so habe ich eben etwas an Anwendungscode geschrieben, der phoneAlarm hier ergänzt¹.

phoneAlarm kann also in Abhängigkeit von z. B. einer Funkzelle ein phoneAlarm aktiviert BluetoothProfil starten. Es startet bei mir, wenn ich Zuhause bin und 22 Uhr ist, dass Profil Sync an.  Das Profil aktiviert Bluetooth und ActiveSync kann es auch starten. Alles gut, könnte man denken, doch ahh, dass mobile ActiveSync kann nicht über Parameter gesteuert werden! Es gibt zwar einiges an über Suchmaschinen erreichbaren Tipps, aber die Synchronisation starten per ActiveSync über Bluetooth mittels ein paar an Parametern geht scheinbar nicht. Einer dieser Tipps ist z. B. die Ergänzung der Verknüpfung zu ActiveSync:

repllog.exe /remote

Doch es funktioniert nicht und so muss etwas Anwendungscode her. phoneAlarm startet dann die zu entwickelnde Anwendung und nicht mehr direkt ActiveSync. Dieses muss also von der zu entwickelnden Anwendung übernommen werden, welche auch nach dem Start von ActiveSync die Nachricht an dieses schickt: Über Bluetooth verbinden.

Nach 10 Minuten wird bei mir auf das Profil Sync aus geschaltet phoneAlarm aktiviert zwar Bluetooth und kann ActiveSync starten, aber das reicht nichtund damit Bluetooth wieder abgeschaltet und ActiveSync beendet, was auch über phoneAlarm erledigt werden kann. Um 23 Uhr wird dann auf das Profil Nacht geschaltet und der MDA Touch schweigt bis zum nächsten Morgen.  

Wie funktioniert das Ganze? Per P/Invoke. ActiveSync findet sich auf einem mobilen Gerät im Verzeichnis \Windows als Datei repllog.exe {1}. Diese Datei wird verwendet, um ActiveSync zu starten {2}. Hier wird etwa fünf Sekunden gewartet und an dieser Stelle könnte der Anwendungscode noch optimiert werden, so dass überprüft wird, ob ActiveSync gestartet wurde. Für den Normalfall sollte es aber so reichen {3}.

Jetzt muss noch nach das Fensterhandle von ActiveSync ermittelt {4} und eine entsprechende Nachricht an dieses geschickt werden {5}. Die Parameter kommen dabei nicht von ungefähr, sondern müssen, da wie sooft nicht dokumentiert, mit Werkzeugen dafür ermittelt werden. Wie das funktioniert, ist aber nicht Teil dieses Artikels. ActiveSync kann übrigens mit einer Nachricht auch beendet werden {6}. Doch dieses muss gar nicht verwendet werden. Es reicht, es entweder über phoneAlarm über Programm schließen zu beenden oder an zu lassen. Über das Profil Zuhause², wird Bluetooth deaktiviert und damit so auch das mobile Gerät "ausgedockt". ActiveSync kann ruhig an bleiben, es läuft im Hintergrund und tut nichts. Das ist auch das Standardverhalten, auch wenn mobile Geräte wie der HTC Touch neuerdings erlauben, die mobilen Anwendungen direkt immer zu beenden, anstatt sie in den Hintergrund mit (X) zu schicken.

Unter Programm ausführen muss also nur die mobile Anwendung ActiveSyncBT eingetragen werden:

\programme\activesyncbt\activesyncbt.exe ActiveSyncBluetoothConnect

Das funktioniert super so. Mit den Entwicklern von phoneAlarm stehe ich jedenfalls auch in Kontakt. Mal schauen, vielleicht wird es in der nächsten Version direkt in phone Alarm eingebaut!? :)

using System;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;

namespace ActiveSyncBT
{
    class Program
    {
        const string ACTIVESYNC = @"\windows\repllog.exe"; // {1}
        const uint WM_COMMAND = 0x00000111;

        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                return;
            }

            if (string.IsNullOrEmpty(args[0]))
            {
                return;
            }

            if (args[0] == "ActiveSyncBluetoothConnect")
            {
                ActiveSyncBluetoothConnect();
            }

            if (args[0] == "ActiveSyncBluetoothDisconnect")
            {
                ActiveSyncBluetoothDisconnect();
            }
        }

        private static void ActiveSyncBluetoothConnect()
        {
            StartActiveSync(); // {2}
            Thread.Sleep(5000); // {3}
            IntPtr hwnd = FindWindow("ActiveSync", null); // {4}
            int wParamStatus = 42020;
            int lParamStatus = 2080867584;
            SendMessage(hwnd, WM_COMMAND, wParamStatus, lParamStatus); // {5}
        }

        private static void ActiveSyncBluetoothDisconnect()
        {
            IntPtr hwnd = FindWindow("ActiveSync", null);
            int wParamStatus = 42020;
            int lParamStatus = 2080866256;
            SendMessage(hwnd, WM_COMMAND, wParamStatus, lParamStatus); // {6}
        }

        [DllImport("coredll.dll")]
        public static extern IntPtr FindWindow(string className, string windowName); 

        [DllImport("coredll.dll")]
        public static extern int SendMessage(
           IntPtr hWnd, uint WM_COMMAND, int wParamStatus, int lParamStatus); public static void StartActiveSync() { Process ActiveSync = Process.Start(ACTIVESYNC, ""); } } }

using System;
using System.Diagnostics;
using System.Threading;
using System.Runtime.InteropServices;

namespace ActiveSyncBT
{
    class Program
    {
        const string ACTIVESYNC = @"\windows\repllog.exe";
        const uint WM_COMMAND = 0x00000111;

        static void Main(string[] args)
        {
            if (args.Length == 0)
            {
                return;
            }

            if (string.IsNullOrEmpty(args[0]))
            {
                return;
            }

            if (args[0] == "ActiveSyncBluetoothConnect")
            {
                ActiveSyncBluetoothConnect();
            }

            if (args[0] == "ActiveSyncBluetoothDisconnect")
            {
                ActiveSyncBluetoothDisconnect();
            }
        }

        private static void ActiveSyncBluetoothConnect()
        {
            StartActiveSync();
            Thread.Sleep(5000);
            IntPtr hwnd = FindWindow("ActiveSync", null);
            int wParamStatus = 42020;
            int lParamStatus = 2080867584;
            SendMessage(hwnd, WM_COMMAND, wParamStatus, lParamStatus);
        }

        private static void ActiveSyncBluetoothDisconnect()
        {
            IntPtr hwnd = FindWindow("ActiveSync", null);
            int wParamStatus = 42020;
            int lParamStatus = 2080866256;
            SendMessage(hwnd, WM_COMMAND, wParamStatus, lParamStatus);
        }

        [DllImport("coredll.dll")]
        public static extern IntPtr FindWindow(string className, string windowName); 

        [DllImport("coredll.dll")]
        public static extern int SendMessage(IntPtr hWnd, uint WM_COMMAND, int wParamStatus, int lParamStatus);

        public static void StartActiveSync()
        {
            Process ActiveSync = Process.Start(ACTIVESYNC, "");
        }
    }
}

¹ Bild "Microsoft - change the world or go home!" im Original entworfen durch Hugh MacLeod von Stormhoek und angepasst von Torsten Weber.
² Nach 10 Minuten um 22:10 Uhr.

ActiveSyncBT.zip (1,77 KB)
ActiveSyncBT_Code.zip (4,18 KB)

All comments require the approval of the site owner before being displayed.
Name
E-mail
(will show your gravatar icon)
Home page

Comment (Some html is allowed: a@href@title, b, blockquote@cite, em, i, strike, strong, sub, sup, u) where the @ means "attribute." For example, you can use <a href="" title=""> or <blockquote cite="Scott">.  

Live Comment Preview

Boldness, risk‐taking and a little bit of craziness – lateral thinker Torsten Weber
Boldness, risk‐taking and a little bit of craziness – lateral thinker Torsten Weber

Torsten Weber is a MVP for Device Application Development

Calendar of the .NET User Group Leipzig

Microsoft Community Leader/Insider Program

Programmieren mit dem .NET Compact Framework. Anwendungsentwicklung für mobile Geräte.

Microsoft – change the mobile world or go home!

Categories

Calendar

<December 2008>
SunMonTueWedThuFriSat
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

Archive

My subscribed blogs

show all
show less
Blogs of good friends (as OPML)
More Blogs (as OPML)
RSS: .NET Casts .NET Casts
RSS: .NET Compact Framework Team .NET Compact Framework Team
RSS: Alan Cameron Wills Alan Cameron Wills
RSS: Alex Feinman Alex Feinman
RSS: Alex Januschewsky Alex Januschewsky
RSS: Alex Yakhnin Alex Yakhnin
RSS: Alexander Wechsler Alexander Wechsler
RSS: Alexander Zeitler Alexander Zeitler
RSS: Amit Chopra Amit Chopra
RSS: Anand Balachandran Anand Balachandran
RSS: Anthony Wong Anthony Wong
RSS: Ausgefallene Gadgets & Ideen Ausgefallene Gadgets & Ideen
RSS: Barry Bond Barry Bond
RSS: Boas Enkler Boas Enkler
RSS: Calvin Hsia Calvin Hsia
RSS: Chris Eberl Chris Eberl
RSS: Chris Lorton Chris Lorton
RSS: Chris Tacke Chris Tacke
RSS: Christian Weyer Christian Weyer
RSS: Christopher Fairbairn Christopher Fairbairn
RSS: ComputerBase News ComputerBase News
RSS: Cordula Lochmann Cordula Lochmann
RSS: Dan Elliot Dan Elliot
RSS: Daniel Chong Jyh Tar Daniel Chong Jyh Tar
RSS: Daniel Fisher Daniel Fisher
RSS: Daniel Melanchthon Daniel Melanchthon
RSS: Daniel Moth Daniel Moth
RSS: Dave Baker Dave Baker
RSS: David Kline David Kline
RSS: Dirk Primbs Dirk Primbs
RSS: DotNetGerman Bloggers DotNetGerman Bloggers
RSS: e-commerce blog e-commerce blog
RSS: Erich Holzbauer Erich Holzbauer
RSS: Florian Mätschke Florian Mätschke
RSS: Frank Fischer Frank Fischer
RSS: Gareth Jones Gareth Jones
RSS: George Mathew George Mathew
RSS: Gurbir Singh Gurbir Singh
RSS: Guy Burstein Guy Burstein
RSS: Hannes Preishuber Hannes Preishuber
RSS: Hard Tecs 4U News Hard Tecs 4U News
RSS: Heike Scholz Heike Scholz
RSS: heise online News heise online News
RSS: HoppeRx HoppeRx
RSS: IE Mobile Team Weblog IE Mobile Team Weblog
RSS: Inside Bennie Inside Bennie
RSS: Inside Microsoft Inside Microsoft
RSS: Jack Greenfield Jack Greenfield
RSS: James Pratt James Pratt
RSS: Jason Hogg Jason Hogg
RSS: Jason Langridge Jason Langridge
RSS: Jens Häupel Jens Häupel
RSS: Jezz Santos Jezz Santos
RSS: Jim Wilson Jim Wilson
RSS: Johanna Merhof  Johanna Merhof
RSS: José Gallardo Salazar José Gallardo Salazar
RSS: Josh Heitzman Josh Heitzman
RSS: Kai Gloth Kai Gloth
RSS: Kevin Daly Kevin Daly
RSS: Lao K Lao K
RSS: Loke Uei Tan Loke Uei Tan
RSS: Maarten Struys Maarten Struys
RSS: Marcus Perryman Marcus Perryman
RSS: Mark Arteaga Mark Arteaga
RSS: Mark Ihimoyan Mark Ihimoyan
RSS: Mark Prentice Mark Prentice
RSS: Markus Hage Markus Hage
RSS: Markus Zeischke Markus Zeischke
RSS: Martin Fowler Martin Fowler
RSS: Mathias Raacke Mathias Raacke
RSS: Mel Sampat Mel Sampat
RSS: Michael Korp Michael Korp
RSS: Michael Saffitz Michael Saffitz
RSS: Mike Hall Mike Hall
RSS: Mike Temporale Mike Temporale
RSS: Mike Zintel Mike Zintel
RSS: Mobile Developer Center Mobile Developer Center
RSS: Mobile Tagging Mobile Tagging
RSS: MozBackup MozBackup
RSS: MS Mobiles MS Mobiles
RSS: MSDN Forum .NET CF MSDN Forum .NET CF
RSS: MSDN Forum Device Emulator MSDN Forum Device Emulator
RSS: MSDN Forum Smart Devices C#/VB MSDN Forum Smart Devices C#/VB
RSS: MSDN Forum Smart Devices MSDN Forum Smart Devices
RSS: MVP Global Summit 2008 MVP Global Summit 2008
RSS: Nazim Lala Nazim Lala
RSS: Neil Cowburn Neil Cowburn
RSS: Neno Loje Neno Loje
RSS: Nils Müller Nils Müller
RSS: Nino Benvenuti Nino Benvenuti
RSS: Norbert Eder Norbert Eder
RSS: Oliver Block Oliver Block
RSS: Oliver Scheer Oliver Scheer
RSS: OrbLog OrbLog
RSS: Outlook Mobile Team Blog Outlook Mobile Team Blog
RSS: OVIDEO (Kino) OVIDEO (Kino)
RSS: OVIDEO (Trailer) OVIDEO (Trailer)
RSS: Pedro Silva Pedro Silva
RSS: Peter Foot Peter Foot
RSS: Peter Kirchner Peter Kirchner
RSS: Rabi Satter Rabi Satter
RSS: Ralf Westphal Ralf Westphal
RSS: Rob Tiffany Rob Tiffany
RSS: Rod Drury Rod Drury
RSS: Roman Batoukov Roman Batoukov
RSS: Scott Guthrie Scott Guthrie
RSS: Scott Holden Scott Holden
RSS: Sebastian Weber Sebastian Weber
RSS: Simon Hackfort Simon Hackfort
RSS: Smartphone-Web Smartphone-Web
RSS: Sriram Krishnan Sriram Krishnan
RSS: Stephen Fry Stephen Fry
RSS: Steve Cook Steve Cook
RSS: Steve Hegenderfer Steve Hegenderfer
RSS: Steven Kelly Steven Kelly
RSS: Steven Pratschner Steven Pratschner
RSS: Stuart Kent Stuart Kent
RSS: Sue Loh Sue Loh
RSS: Thomas Schissler Thomas Schissler
RSS: Tom Hollander Tom Hollander
RSS: Vik Thairani Vik Thairani
RSS: Visual Studio For Devices Team Visual Studio For Devices Team
RSS: We-Dig.org We-Dig.org
RSS: Windows Mobile Team Blog Windows Mobile Team Blog
RSS: Xin Yan Xin Yan