web_cast(c)

Aug 26, 2008 12:34

Великое это дело - исполнение желаний.
Особенно, если сам исполняешь и желания свои же.

Вчера попробовался в вебкасте для микрософта. Немножко рассказал о полезных фичах в составе потайных библиотек.
Правда, ушёл с работы заполночь...



Есть такая библиотека в составе .Net Compact Framework v2 - Microsoft.WindowsCE.Forms.
Почему её запихали в неймспейс WindowsCE, хотя приспособлена она для WindowsMobile - это загадка. Видимо, она может работать и на всяких банкоматах и навигаторах, где стоит просто WinCE, а не WinMobile.

В её составе есть класс HardwareButton - объект, одним концом цепляющийся к аппаратной кнопке (ну там, знаете, камера/диктофон/пуск и т.д.), а вторым - к окошку.
По нажатию на кнопку объект посылает окну два сообщения - KeyUp и Activate.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using Microsoft.WindowsCE.Forms;

namespace HardwareButtons
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

HardwareButton _appButton2; // (*1*)
HardwareButton _appButton3;
private void Form1_Load(object sender, EventArgs e)
{
_appButton2 = new HardwareButton(); // (*2*)
_appButton2.AssociatedControl = this;
_appButton2.HardwareKey = HardwareKeys.ApplicationKey2;

_appButton2 = new HardwareButton(); // (*3*)
_appButton2.AssociatedControl = this;
_appButton2.HardwareKey = HardwareKeys.ApplicationKey3;
}

private void Form1_KeyUp(object sender, KeyEventArgs e)
{
switch ((HardwareKeys)e.KeyCode) // (*4*)
{
case HardwareKeys.ApplicationKey2:
statusBar1.Text = "activated by app key 2"; // (*5*)
break;
case HardwareKeys.ApplicationKey3:
statusBar1.Text = "activated by app key 3";
break;
}
}

private void Form1_Deactivate(object sender, EventArgs e)
{
statusBar1.Text = ""; // (*5*)
}
}
}

По ходу - примечания:

1) Объект-хэндлер нужно поместить на уровне класса - чтобы его время жизни совпало со временем жизни формы. Если сделать локальную переменную - то она какое-то время даже будет работать, до первой сборки мусора.

2) О пользе варнингов. Забыл написать эту строчку, - компилятор предупредил, что переменная нигде не инициализируется.

3) О вреде копипаста и коварстве мусоросборщика. Добавил ещё одну кнопку, но при копировании забыл исправить _appButton2 на _appButton3. В итоге обработчик кнопки №2 отвязался от _appButton2 и продолжил работать... до сборки мусора. Был бы мусоросборщик стремительным - как в системах с подсчётом ссылок, например, в VB6 - программа стремительно стала бы работать не так и дала повод задуматься.
Интересно, сколько в мире напедалено такого говнокода на управляемых языках? И когда этот код бабахнет? И как его отследить?...

4) Перечисление Microsoft.WindowsCE.Forms.HardwareKeys - это, на самом деле, подмножество перечисления System.Windows.Forms.Keys. Но с точки зрения компилятора это два разных типа, поэтому нужно кастить в ту или другую сторону.

5) Вот так можно отличить простую активизацию окна (когда запустили что-то поверх, а потом это что-то захлопнули) от активизации по кнопке.

программирование

Previous post Next post
Up