Tiếp xúc với công nghệ đa chuột MultiPoint Mouse

Windows MultiPoint Mouse là gì?

Windows MultiPoint Mouse là một công nghệ do Microsoft nghiên cứu và phát triển.

Công nghệ MultiPoint Mouse (xin viết tắt MPM) là một ý tưởng nhỏ thay đổi cách chúng ta tương tác với máy tính, bằng việc cung cấp khả năng viết ứng dụng trong đó có nhiều con trỏ chuột trên màn hình, nhiều chuột cùng tương tác, khác biệt so với bình thường. Bình thường gắn nhiều chuột vào máy tính ta cũng chỉ có một con trỏ mà thôi.

Do một số lý do về tên hoặc do sự phát triển chưa rộng nên MPM thường bị hiểu nhầm sang những công nghệ khác, thường là nhầm lẫn với Mouse Mischief – một công nghệ phát triển trên nền MPM. Dẫn tới ngoài các nguồn tài nguyên từ phía Microsoft thì các nguồn thông tin khác đa phần ko chính xác hoặc ko có cách hiểu đúng về MPM.

Một bài viết trước đây của mình trên blog VitCon (một MSP, cũng là bạn mình) nay cũng đã ko còn đúng bởi đã tới các phiên bản mới hơn. Bạn vẫn có thể tham khảo trong trường hợp muốn biết MPM trước đây nó “ra làm răng”: http://www.vcprojects.com/2009/06/28/multipoint.

Trong tiếng Việt lâu nay vẫn thường gọi MPM là “công nghệ đa chuột”, hoặc “công nghệ phát triển ứng dụng đa chuột”. Nhưng tên này cũng hay được dùng cho Mouse Mischief nên dẫn tới nhiều nhầm lẫn ở Việt Nam. Mouse Mischief được giới thiệu ở dưới.

hero-mousesdk Trang chính thức của Windows MultiPoint Mouse:

Trang chính thức của Windows MultiPoint Mouse SDK là http://www.microsoft.com/multipoint/mouse-sdk/ . Tại đây ta có thể tải về bộ SDK mới nhất. Sản phẩm này được cung cấp miễn phí.

Vào phần View Samples để tải về các ứng dụng hay đã được phát triển trên MPM. Như các phần mềm chơi nhạc cho nhiều người, các phần mềm xếp hình, dựng cảnh truyện tranh cho nhiều người cùng chơi… Các chương trình này nội dung tập trung vào phục vụ giáo dục bậc tiểu học, trung học – mảng mà hiện tại MS thấy có khả năng áp dụng MPM nhất.

Trong các sample thì mình thích nhất là Mouse Mischief, một plug-in của Office PowerPoint để tạo các slide có các trang tương tác với nhiều chuột. Và sản phẩm này đã được Microsoft thí điểm sử dụng ở nhiều nơi trên thế giới, trong đó có Việt Nam. Với plug-in này giáo viên có thể tạo các trang slide để cho học sinh làm trắc nghiệm, hoặc các slide để học sinh tương tác như một bảng vẽ. Ứng dụng này giúp cho việc áp dụng các bài giảng theo slide có tính tương tác cao hơn mà chi phí đầu tư hệ thống ko quá lớn. Cả ứng dụng này cũng được cung cấp miễn phí. MultiPoint Mouse chứa những gì?

Mặc định MPM được cài vào thư mục “C:\Program Files\Windows MultiPoint Mouse SDK\”. Trong đó 1 file document của MPM, thư mục Bin chứa các file chức năng của MPM, thư mục Samples chứa các project mẫu, các project này có chứa tất cả các kĩ thuật cơ bản của MPM, khi tìm hiểu MPM ko thể ko đọc nó.

Các phần quan trọng nhất của MPM đều ở trong thư mục Bin. Thành phần chính là 1 file thư viện Microsoft.Multipoint.Sdk.dll . Trong thư viện này chứa class của SDK, chứa các class handle event, quản lý các thiết bị, exception,…

File thư viện quan trọng thứ 2 là Microsoft.Multipoint.Sdk.Controls.dll . Thư viện này chứa 2 control xây dựng sẵn của MPM là MultipointButton và MultipointTextBox, tương ứng có chức năng giống Button và TextBox trong Windows Presentation Foundation (WPF).

Ta xây dựng ứng dụng MPM với 2 thư viện trên.

Các thành phần còn lại trong thư mục Bin phục vụ cho việc tạo các file cài đặt .msi từ project MPM mà ta xây dựng. MultiPoint Mouse hỗ trợ những hệ thống như thế nào? (System Requirements)

Hiện tại khi mình viết bài này thì phiên bản mới nhất của MPM là 1.5.1

Yêu cầu hệ thống của phiên bản này là:

Windows 7, Windows Vista Service Pack 2 (SP2), Windows XP SP3. Hỗ trợ cả win 32bit và 64bit
Các pointing-device MPM hỗ trợ là chuột USB, chuột PS/3, touchpad.
Để phát triển phầm mềm MPM ta sử dụng Microsoft Visual Studio 2008, Microsoft Visual Studio 2010.

Sử dụng MultiPoint Mouse phát triển phần mềm:

Để đưa các chức năng MultiPoint Mouse vào một ứng dụng WPF, ta thêm References vào project tới 2 thư viện Microsoft.Multipoint.Sdk.dll và Microsoft.Multipoint.Sdk.Controls.dll .

Một số tính năng đc MPM tự động thực hiện. Thiết bị chuột cắm vào sẽ tự động được nhận và có thông tin tương ứng, khi rút ra cũng vậy. Mặc định MPM cũng tự động tạo ra con trỏ chuột cho các thiết bị và hiện lên màn hình. Gần như tất cả những gì để ứng dụng là đa chuột đã được tự thực hiện một cách đơn giản.

Vậy là bước tiếp cận với MPM là “dễ như ăn bánh”, phần còn lại là những kĩ thuật lập trình thường sử dụng khi viết ứng dụng MPM sẽ được mình trình bày trong blog này. MultiPoint hay Multipoint?

Tên các sản phẩm của MS vẫn thường dài, ngay cả MPM cũng đã qua lần đổi tên. Trên trang web chính thức thì tên của sản phẩm sử dụng MultiPoint, còn theo quy chuẩn đặt tên namespace của MS thì các class trong thư viện đc đặt trong namespace là Microsoft.Multipoint. Có lẽ việc đổi tên thường xuyên vẫn là thói quen xấu của MS. Mở rộng

MultiPoint Mouse là một trong 3 sản phẩm trong nhóm MultiPoint Solutions của MS, gồm có:

Windows MultiPoint Mouse SDK
Microsoft Mouse Mischief
Windows MultiPoint Server 2010

Bộ 3 sản phẩm đều nhắm tới việc cung cấp các giải pháp tận dụng phần cứng, nhưng vẫn đem lại khả năng khai thác máy tính cho nhiều người sử dụng hơn.

Mouse Mischief được phát triển dựa trên thư viện MultiPoint Mouse. Còn Windows MultiPoint Server 2010 là một phiên bản hệ điều hành Windows đặc biệt, sử dụng công nghệ ảo hoá Hyper-V để chỉ cần một computer, ta có thể có nhiều terminal cho nhiều người dùng, mỗi terminal gồm 1 màn hình, 1 bàn phím, 1 chuột nối vào chung 1 computer đó. Khi đó mỗi người đều có một trải nghiệm đầy đủ việc sử dụng máy tính trong khi chỉ đầu tư 1 hệ thống computer duy nhất. Sản phẩm này đã nhanh chóng được nhiều hãng máy tính sử dụng và đã có sản phẩm bán ra. Viết ứng dụng MultiPoint Mouse đầu tiên

Tiếp xúc với công nghệ đa chuột MultiPoint Mouse, nhiều người không biết phải bắt đầu develop như thế nào vì nguồn tài liệu gần như không có. Đây là bài viết hướng dẫn các bước cơ bản để làm ứng dụng MultiPoint Mouse, kèm theo đó là những giải thích ở các bước. Nội dung chính Các công nghệ sử dụng Ứng dụng WPF nhỏ khai thác các tính năng cơ bản của MultiPoint Mouse SDK. WPF C#

Source Code: FirstMPMApp.zip MultiPoint Mouse hoá ứng dụng WPF

Việc đầu tiên cần “kích hoạt” chức năng MultiPoint Mouse cho một ứng dụng WPF. Vào menu File –> New –> New Project để tạo một project WPF mới. Đặt tên Project là FirstMPMApp, click OK để tạo project.

01 new project

MPM cung cấp 2 file thư viện cho việc lập trình trong thư mục cài đặt. Đầu tiên ta add file thư viện Microsoft.Multipoint.Sdk.dll. Vào menu Project –> Add Reference… Chọn tab Browse và trỏ tới đường dẫn cài đặt MultiPoint Mouse (mặc định là C:\Program Files\Windows MultiPoint Mouse SDK\Bin), chọn file thư viện cần như trong hình. Click OK.

02 add 1

Trong MainWindows.xaml.cs, cho vào đoạn code như sau: Miếng Code

    public MainWindow()
    {
    InitializeComponent();
    this.Loaded += newRoutedEventHandler(MainWindow_Loaded);
    }
    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
    // Register this window with MultiPoint Mouse
    MultipointSdk.Instance.Register(this);
    }
Cần thêm namespace cần thiết ở đầu file, thêm dòng “using Microsoft.Multipoint.Sdk; “

Dòng code thứ 4 để thêm một event handler cho sự kiện Loaded của cửa sổ hiện hành. Khi cửa sổ được load lên ta thực hiện đăng kí nó với MultiPoint Mouse để chức năng MPM có thể chạy. Dòng code thứ 10 trong event handler thực hiện điều đó. F5 chạy chương trình được kết quả sau:

03 frst run

Khi cửa sổ đã được đăng kí với MPM, MPM tự động nhận biết các thiết bị chuột kết nối với máy và tạo các con trỏ tương ứng trên cửa sổ ứng dụng. Máy mình đang kết nốt 1 chuột USB và 1 trackpad sẵn của laptop nên có 2 con chuột trên màn hình.

Nhấn Alt + F4 để thoát ứng dụng.

Để tiện lợi trong sử dụng, ta nên thêm chức năng nhấn Esc để đóng cửa sổ, bằng cách thêm event handler cho sự kiện this.KeyDown. Miếng Code

public MainWindow()
    {
    InitializeComponent();
    this.Loaded += newRoutedEventHandler(MainWindow_Loaded);
    this.KeyDown += newKeyEventHandler(MainWindow_KeyDown);
    }
    void MainWindow_KeyDown(object sender, KeyEventArgs e)
    {
    switch (e.Key)
    {
    caseKey.Escape:
    this.Close();
    break;
    }
    }

Xử lý thao tác với con trỏ chuột

MPM hỗ trợ nhiều chức năng với việc xử lý con trỏ chuột. Một vài chức năng quan trọng:

Thay đổi hình ảnh con trỏ chuột, chuyển chúng thành các hình ảnh bitmap tuỳ ý.
Thay đổi tốc độ của các chuột.
Điều chỉnh cho chuột được/ko đc phép di chuyển (đứng yên tại chỗ).
Điều chỉnh ẩn/hiện các chuột.
Điều chỉnh vị trí của các chuột trên màn hình (gán vào một toạ độ bất kì).
Xử lý các sự kiện click chuột.
Lấy các thông tin về thiết bị chuột (ID phân biệt, name,…)

Từng đó thao tác đã đủ để ta quản lý hầu hết các tác vụ liên quan tới chuột. Các chức năng này sẽ lần lượt được trình bày trong bài lab này và các bài lab tiếp theo.

Bây giờ ta thử thực hiện cho các chuột nằm ở vị trí (0,0) và bắt nó đứng yên cho tới khi ta nhấn Space thì mới cho phép chạy.

Bổ sung 2 event handler đã tạo ở phần trước như sau: Miếng Code

 void MainWindow_KeyDown(object sender, KeyEventArgs e)
    {
    switch (e.Key)
    {
    caseKey.Escape:
    this.Close();
    break;
    caseKey.Space: // Enable movement of all mouses
    foreach (DeviceInfo item inMultipointSdk.Instance.MouseDeviceList)
    {
    item.DeviceVisual.DisableMovement = false;
    }
    break;
    }
    }
    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
    // Register this window with MultiPoint Mouse
    MultipointSdk.Instance.Register(this);
    // Disable movement of all mouses
    foreach (DeviceInfo item inMultipointSdk.Instance.MouseDeviceList)
    {
    item.DeviceVisual.SetPosition(newPoint(0, 0));
    item.DeviceVisual.DisableMovement = true;
    }
    }

Vòng lặp trong handler Loaded duyệt qua collection MultipointSdk.Instance.MouseDeviceList chứa thông tin của tất cả các chuột hiện hành (dưới dạng biến Microsoft.Multipoint.Sdk.DeviceInfo), và thực hiện thay đổi các thông tin trong field DeviceVisual – quản lý thông tin hiển thị của trỏ chuột.

Vòng lặp trong case nhấn Space trong handler KeyDown chỉ thực hiện việc cho phép các trỏ chuột có thể di chuyển trở lại.

//YOU-DO: F5 chạy chương trình để thử. Multipoint Controls

Tiếp theo, ta làm một chức năng đơn giản cho chuột click vào một button và tên của thiết bị sẽ hiện ra.

Thực hiện lại việc Add Reference đối với file thư viện Microsoft.Multipoint.Sdk.Controls.dll như đã làm ở trên.

Bổ sung code giao diện trong file MainWindow.xaml như sau: Miếng Code

```CSS

<Window x:Class=“FirstMPMApp.MainWindow”
    xmlns=“http://schemas.microsoft.com/winfx/2006/xaml/presentation&#8221;
    xmlns:x=“http://schemas.microsoft.com/winfx/2006/xaml&#8221;
    xmlns:mpm=“clr-namespace:Microsoft.Multipoint.Sdk.Controls;assembly=Microsoft.Multipoint.Sdk.Controls”
    Title=“MainWindow” Height=350” Width=525>
    <Grid>
    <mpm:MultipointButton Content=Click Me” Margin=10” Height=25” Width=100”
    HorizontalAlignment=“Right” VerticalAlignment=“Top”
    x:Name=“mbtnClickMe” Focusable=“False”
    MultipointClick=“mbtnClickMe_MultipointClick”/>
    <TextBlock x:Name=“txtMouseName” Margin=5,45,5,5” TextWrapping=“Wrap”
    FontSize=25/>
    </Grid>
    </Window>


Dòng 4 là để thêm namespace Microsoft.Multipoint.Sdk.Controls vào file. Hiện trại thư viện control này có 2 control cơ bản của MPM là MultipointButton, MultipointTextbox tương ứng với chức năng của Button và Textbox trong ứng dụng thường. Chỉ có các control xây dựng đã áp dụng MPM mới có thể nhận được các sự kiện nhấn phím của chuột. Các control có sẵn của WPF ko hỗ trợ MPM.

Dòng 7, control MultipointButton nhận sự kiện riêng sinh bởi trỏ chuột trong MPM là MultipointClick, tương ứng với sự kiện Button.Click trong WPF.

Trong code behind MainWindow.xaml.cs ta bổ sung event handler MultipointClick:
Miếng Code

```Csharp
 privatevoid mbtnClickMe_MultipointClick(object sender, RoutedEventArgs e)
    {
    MultipointMouseEventArgs args = e asMultipointMouseEventArgs;
    if (args == null) return;
    txtMouseName.Text = args.DeviceInfo.DeviceName;
    }

Chuyển kiểu RoutedEventArgs về Microsoft.Multipoint.Sdk.MultipointMouseEventArgs, thông qua đó ta lấy được thông tin về chuột đã thực hiện event tương ứng. Sau đó thực hiện truy cập thông tin của chuột qua field DeviceInfo.

//YOU-DO: F5 chạy chương trình, nhấn Space để cho các chuột di chuyển, thử click các chuột lên button để thấy DeviceName của chúng.

04 click me Xử lý việc plug-in/plug-out các thiết bị chuột

Trong quá trình sử dụng ứng dụng, các thiết bị chuột có thể bị tháo ra hoặc lắp vào thêm. Khi đó có thể ta cần xác định chuột nào đã bị tháo ra/lắp vào và thực hiện các công việc tương ứng.

Để phân biệt các thiết bị có thể sử dụng DeviceInfo.DeviceId hoặc DeviceInfo.Id hoặc DeviceInfo.DeviceName. MPM đã hỗ trợ sẵn việc huỷ con trỏ của chuột khi thiết bị được tháo ra và tự tạo một con trỏ mới có cursor mặc định như thấy trong hình.

Có thể ta sẽ cần thực hiện gán cursor mới mỗi khi có thiết bị mới gắn vào để có thể phân biệt các con trỏ, hoặc huỷ các thông tin người dùng của con trỏ đó trong ứng dụng (vd: điểm số, tên,…).

Bây giờ ta thực hiện thông báo trong TextBlock mỗi khi thiết bị được tháo ra hoặc cắm vào, và thiết bị mới được gắn sẽ đặt con trỏ tại vị trí (0, 0) cho tới khi nhấn Space mới di chuyển được.

Bổ sung code trong code behind MainWindow.xaml.cs như sau: Miếng Code

    void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
    // Register this window with MultiPoint Mouse
    MultipointSdk.Instance.Register(this);
    // Disable movement of all mouses
    foreach (DeviceInfo item inMultipointSdk.Instance.MouseDeviceList)
    {
    item.DeviceVisual.SetPosition(newPoint(0, 0));
    item.DeviceVisual.DisableMovement = true;
    }
    // Handle mouses plug-in and plug-out
    MultipointSdk.Instance.DeviceArrivalEvent += newEventHandler<DeviceNotifyEventArgs>(Instance_DeviceArrivalEvent);
    MultipointSdk.Instance.DeviceRemoveCompleteEvent += newEventHandler<DeviceNotifyEventArgs>(Instance_DeviceRemoveCompleteEvent);
    }
    void Instance_DeviceRemoveCompleteEvent(object sender, DeviceNotifyEventArgs e)
    {
    txtMouseName.Text =Just plug-out a device!! \n Name:+ e.DeviceInfo.DeviceName;
    }
    void Instance_DeviceArrivalEvent(object sender, DeviceNotifyEventArgs e)
    {
    txtMouseName.Text =New pointing-device!! \n Name:+ e.DeviceInfo.DeviceName;
    // Init first status of a new pointer
    e.DeviceInfo.DeviceVisual.SetPosition(newPoint(0, 0));
    e.DeviceInfo.DeviceVisual.DisableMovement = true;
    }

Dòng 14 thêm event handler khi một thiêt bị được gắn vào. Dòng 15 thêm event handler khi một thiết bị bị tháo ra.

//YOU-DO: chạy thử chương trình, trong quá trình dùng thử tháo ra và gắn vào các chuột đồng thời quan sát quá trình xử lý. Chú ý chuột mới gắn vào thì phải nhấn Space chuột mới được phép di chuyển. Kết luận

Lab đã vừa đi qua hết 3 mảng xử lý cơ bản của một ứng dụng MPM. Các chức năng cơ bản này được hỗ trợ sẵn, từ đó ta tiếp tục xây dựng những chức năng khác. Cơ bản thì MPM thật đơn giản cho bất cứ ai đã biết lập trình với C# và WPF. Trong các bài tiếp mình sẽ trình bày cách xây dựng các chức năng khác cho ứng dụng MPM. Nguồn: http://viettp.wordpress.com