我正在尝试使用Magnification API为32 位 Windows 8 Pro 平板电脑编写辅助功能应用程序。应用程序可以完美地放大和缩小全屏,但是当放大时,点击事件被发送到未放大屏幕的错误位置,因此用户无法触摸他所看到的确切内容。
为了解决这个问题,我尝试了MagSetInputTransform(fSetInputTransform, rcSource, rcDest)
. 它适用于64 位 Windows 8 桌面,但是当我在平板电脑上测试它时,我收到以下错误:
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)
当我尝试为 x86 目标平台编译项目并在 64 位机器下测试时,得到完全相同的错误。
总结;
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 ?
如何在 32 位 Windows 8 平板电脑中使用此 WinAPI 功能?
编辑1
这是产生错误的方法:
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");
}
}
}
编辑2
以下是 pinvoke 签名:
[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);
这就是我的 RECT 结构的样子。