I am trying to write an accesibility app for 32bit Windows 8 Pro tablet PC using Magnification API. App can perfectly zoom-in and zoom-out full screen, but when zoomed in, the click events are sent to wrong places of the unmagnified screen, so user can' t touch what he sees exactly.
To solve this, I tried MagSetInputTransform(fSetInputTransform, rcSource, rcDest)
. It works on 64bit Windows 8 desktop but when I test it on tablet, I get the following error:
System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
at GTZoom.WinAPIMethods.MagSetInputTransform(Boolean fEnabled, RECT prcSource, RECT prcDest)
at GTZoom.ZoomControl.SetInput(IntPtr hwndDlg, Boolean fSetInputTransform) in c:\Users\AlpayK\Desktop\GTMagnify\GTMagnify\ZoomControl.cs:line 113
at GTZoom.ZoomControl.trackBar1_Scroll(Object sender, EventArgs e) in c:\Users\AlpayK\Desktop\GTMagnify\GTMagnify\ZoomControl.cs:line 37
at System.Windows.Forms.TrackBar.OnScroll(EventArgs e)
at System.Windows.Forms.TrackBar.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
The exactly same error is obtained, when I try to compile project for x86 target platform and test under 64bit machine.
To summarize;
Target platform x64 -> Tested under 64bit Windows 8 Desktop OK
Target platform x86 -> Tested under 64bit Windows 8 Desktop ERROR
Target platform x64 -> Tested under 64bit Windows 8 Tablet ERROR
Target platform x86 -> Tested under 32bit Windows 8 Tablet ERROR ?
How can I use this WinAPI function in 32bit Windows 8 tablet?
EDIT1
Here is the method that produces the error:
void SetInput(IntPtr hwndDlg, bool fSetInputTransform)
{
bool fContinue = true;
RECT rcSource = new RECT();
RECT rcDest = new RECT();
// MagSetInputTransform() is used to adjust pen and touch input to account for the current magnification.
// The "Source" and "Destination" rectangles supplied to MagSetInputTransform() are from the perspective
// of the currently magnified visuals. The source rectangle is the portion of the screen that is
// currently being magnified, and the destination rectangle is the area on the screen which shows the
// magnified results.
// If we're setting an input transform, base the transform on the current fullscreen magnification.
if (fSetInputTransform)
{
// Assume here the touch and pen input is going to the primary monitor.
rcDest.Right = screenWidth;
rcDest.Bottom = screenHeight;
float magnificationFactor = 0;
int xOffset = 0;
int yOffset = 0;
// Get the currently active magnification.
if (WinAPIMethods.MagGetFullscreenTransform(ref magnificationFactor, ref xOffset, ref yOffset))
{
// Determine the area of the screen being magnified.
rcSource.Left = xOffset;
rcSource.Top = yOffset;
rcSource.Right = rcSource.Left + (int)(rcDest.Right / magnificationFactor);
rcSource.Bottom = rcSource.Top + (int)(rcDest.Bottom / magnificationFactor);
}
else
{
// An unexpected error occurred trying to get the current magnification.
fContinue = false;
}
}
if (fContinue)
{
// Now set the input transform as required.
if (!WinAPIMethods.MagSetInputTransform(fSetInputTransform, rcSource, rcDest))
{
MessageBox.Show("Err");
}
}
}
EDIT2
Here are the pinvoke signatures:
[DllImport("Magnification.dll", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool MagGetFullscreenTransform(ref float magLevel, ref int xOffset, ref int yOffset);
[DllImport("Magnification.dll", CallingConvention = CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool MagSetInputTransform(bool fEnabled, RECT prcSource, RECT prcDest);
And this is how my RECT structure looks like.
WinAPIMethods.MagSetInputTransform(fSetInputTransform, rcSource, rcDest)
WinAPIMethods.MagSetInputTransform(fSetInputTransform, ref rcSource, ref rcDest)
and pinvoke
public static extern bool MagSetInputTransform(bool fEnabled, RECT prcSource, RECT prcDest);
public static extern bool MagSetInputTransform(bool fEnabled, ref RECT prcSource, ref RECT prcDest);
MagSetInputTransform takes LPRECT
s, not RECT
s
I can't explain why it worked on one machine though.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With