There is a known issue related to using WPFBrowserView (heavyweight rendering mode) in Windows 7 environment with touch screen. Sometimes some touch events are not dispatched properly in DotNetBrowser, and touching a hyperlink may not work at all.


This is not reproducible for Windows 8 and newer environments.


Cause:

The issue is related to the specific implementation of touch events on Windows 7.

The WPF application consumes WM_TOUCH events, and they are simply not passed to the native side. This is reproducible because of Z-order, and the issue is gone if the WPF touch events are disabled.


The issue is not reproducible in newer environments because of differences in the native touch implementation.


Solution:

After disabling touch events for a window in WPF the issue is no longer reproducible for the WPFBrowserView control.


Disabling WPF touch events for a window:

https://msdn.microsoft.com/en-us/library/dd901337(v=vs.90).aspx


The following sample code shows how to remove the default tablet platform support during window source initialization.


protected override void OnSourceInitialized(EventArgs e)
{
    Type inputManagerType = typeof(InputManager);

    object stylusLogic = inputManagerType.InvokeMember("StylusLogic",
        BindingFlags.GetProperty |
        BindingFlags.Instance |
        BindingFlags.NonPublic,
        null,
        InputManager.Current,
        null);

    Type stylusLogicType = stylusLogic.GetType();
    FieldInfo deviceCount = stylusLogicType.GetField("_lastSeenDeviceCount",
        BindingFlags.Instance | BindingFlags.NonPublic);

    while (Tablet.TabletDevices.Count > 0)
    {
        if (deviceCount != null)
            deviceCount.SetValue(stylusLogic,
                1 + (int) deviceCount.GetValue(stylusLogic));

        int index = Tablet.TabletDevices.Count - 1;

        stylusLogicType.InvokeMember("OnTabletRemoved",
            BindingFlags.InvokeMethod |
            BindingFlags.Instance |
            BindingFlags.NonPublic,
            null,
            stylusLogic,
            new object[] {(uint) index});
    }

    base.OnSourceInitialized(e);
}