Some notes on software development... RSS 2.0
# Thursday, 28 February 2008

On a CE device, when a touch screen is pressed, the running application will receive a mouse click message. This message then gets filtered down through the application and eventually arrives at where it is supposed to be in the application level, i.e. click on a button control.

So to completely disable the touch screen on a Windows CE device you can suppress any mouse button messages that get sent from the device thus preventing them from getting dispatched to you application.

To do this you can add a filter object (that implements IMessageFilter) to the application's message pump, check the message type, if the message is a mouse click message then cancel it.

Unfortunately message filtering with CF 2.0 is not supported out of the box however, luckily for us the clever chaps at OpenNETCF have provided us with the classes we need to complete the task with their excellent Smart Device Framework library.

On to some code...here is my DisableTouchScreenFilter class that implements the IMessageFilter:

using System;
 
using Microsoft.WindowsCE.Forms;
using OpenNETCF.Windows.Forms;
 
public class DisableTouchScreenFilter : IMessageFilter
{
    private const int WM_MBUTTONDBLCLK = 0x0203;
    private const int WM_LBUTTONDOWN = 0x0201;
    private const int WM_LBUTTONUP = 0x0202;
 
    public bool PreFilterMessage(ref Message message)
    {
        bool result = false;
 
        if (message.Msg == WM_LBUTTONUP ||
            message.Msg == WM_MBUTTONDBLCLK ||
            message.Msg == WM_LBUTTONDOWN)
        {
            result = true;
        }
 
        return result;
    }
}


You can actually check any Windows message that arrives at the PreFilterMessage method, however I have only defined the message constants that are required for handling the mouse click message.
For a full list of what all the Windows message are you can check out Windows Message (Enums).

To plumb in the filter to the application message pump you need to call the static AddMessageFilter method on the Application2 object. To remove the filter call the RemoveMessageFilter method passing in the same filter object.

An example of adding the message filter to the Application message pump:

Application2.AddMessageFilter(new DisableTouchScreenFilter());


Notes
You need to run your application using the Application2 class from the Smart Device Framework library.
The mouse message gets completely cancelled before it gets to any forms or controls. This means that absolutely no mouse click events will fire at all.
There may be a slight performance hit with the application due to the message filter evaluating ever message that gets passed to the application.



Thursday, 28 February 2008 18:01:41 (GMT Standard Time, UTC+00:00)  #    -
CF
# Wednesday, 27 February 2008

I got the Internal error 2715 'Component' after I created an InstallShield component with only registry settings in it.

The error message from the log file is:

The specifield File Key component not found in the File Table

So the solution? Don't create InstallShield components that contain only registry settings and no files.

Wednesday, 27 February 2008 15:20:20 (GMT Standard Time, UTC+00:00)  #    -
InstallShield

To run a setup.exe with logging from the command line:

<path to setup file>\setup.exe /verbose"C:\IS.log"

Links:
Setup.exe and Update.exe Command-Line Parameters

Wednesday, 27 February 2008 14:32:20 (GMT Standard Time, UTC+00:00)  #    -
InstallShield
# Wednesday, 20 February 2008

The ActiveSync log file is located in the user temp directory and is called WCESMgr.log.

An example of the type of detail that get logged by ActiveSync:

**** ActiveSync (4.5.5096 RETAIL) started, Cmd line: '/show'
01/07/2008 14:26:46.553 ERROR returned in function CMainFrmWnd::ReadWindowPlacement. hr: 0x80070002
01/07/2008 14:27:14.499 **************** Logging Started ****************
01/07/2008 14:27:14.499 Process C:\Program Files\Microsoft ActiveSync\WCESMgr.exe  p(3452)
01/07/2008 14:27:14.499 ActiveSync second instance started, Cmd line: '/onconnect'
01/07/2008 14:27:14.499 ActiveSync second instance exiting
01/07/2008 14:27:14.499 **************** Logging Stopped ****************
01/07/2008 14:27:14.752 Creating new partnership for device 0x0 (Allegro60344308, XScale).
01/07/2008 14:27:14.752 Found PIM at 'C:\PROGRA~1\MICROS~2\Office12\OUTLOOK.EXE'
01/07/2008 14:27:14.752 Notes Sync not available for device type: 'XScale'
01/07/2008 14:27:22.992 Connected to device 0x64742AEE (XScale, Allegro60344308) [partner 0]
01/07/2008 14:27:22.992 **** Starting synchronization engine
01/07/2008 14:27:22.992 Remote object: 'File', SSPId: 0x00002711 [2 items]
01/07/2008 14:27:22.992 WARNING: Object type 'Appointment' is not installed on the device
01/07/2008 14:27:22.992 WARNING: Object type 'Contact' is not installed on the device
01/07/2008 14:27:22.992 WARNING: Object type 'Task' is not installed on the device
01/07/2008 14:27:25.174 Lost global mapping, uCode: MC_NEW_DESKTOP
01/07/2008 14:27:25.174 **** Synchronization engine started
01/07/2008 14:59:50.481 **** ActiveSync session completed.
01/07/2008 14:59:52.560 **** ActiveSync exiting
01/07/2008 14:59:52.560 **************** Logging Stopped ****************
01/08/2008 10:33:40.431 **************** Logging Started ****************
01/08/2008 10:33:40.431 Process C:\Program Files\Microsoft ActiveSync\WCESMgr.exe  p(3444)

Wednesday, 20 February 2008 11:16:55 (GMT Standard Time, UTC+00:00)  #    -
ActiveSync
Navigation

Sign In
Extras
Statistics
Total Posts: 116
This Year: 0
This Month: 0
This Week: 0
Comments: 36
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2018
Hadrian Phillips

All Content © 2018, Hadrian Phillips
DasBlog theme 'Business' created by Christoph De Baene (delarou)