Windows Mobile

Türchen Nummer 21

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_KEYDOWNn");
    //Behandlung für den Tastencode ist hier nicht aufgeführt
    HandleKey(wParam);
    break;
case WM_KEYUP:
    OutputDebugString(L"WM_KEYUPn");
    //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

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s