user32.dll 代码在 x86 下有效,但在 x64 下无效
user32.dll code works under x86 but not x64
我一直在使用 https://github.com/cerebrate/mousejiggler 中的一些代码来防止 Windows PC 闲置。它找到了,但是当我将它移植到一个新的应用程序时,它在执行时开始崩溃。具体在行:
if (SendInput(1, ref inp, 28) != 1)
throw new Win32Exception();
新应用程序 运行 作为 x64 应用程序,而旧应用程序是 x86。为 x86 构建新的应用程序解决了这个问题。完整代码如下。我正在努力弄清楚为什么会这样。支柱中有一个 IntPtr
会根据平台从 4 字节变为 8 字节,但据我所知,没有办法改变它。我想我可以创建一个 32 位 int 指针并使用不安全代码,但我什至不确定这是否真的是问题所在。
关于如何针对 x64 平台修复它的任何想法?
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
[MarshalAs(UnmanagedType.U4)]
public UInt32 cbSize;
[MarshalAs(UnmanagedType.U4)]
public UInt32 dwTime;
}
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
static uint GetLastInputTime()
{
uint idleTime = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
uint envTicks = (uint)Environment.TickCount;
if (GetLastInputInfo(ref lastInputInfo))
{
uint lastInputTick = lastInputInfo.dwTime;
idleTime = envTicks - lastInputTick;
}
return ((idleTime > 0) ? (idleTime / 1000) : 0);
}
public static class Jiggler
{
internal const int INPUT_MOUSE = 0;
internal const int MOUSEEVENTF_MOVE = 0x0001;
[DllImport("user32.dll", SetLastError = true)]
private static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);
public static void Jiggle(int dx, int dy)
{
var inp = new INPUT();
inp.TYPE = Jiggler.INPUT_MOUSE;
inp.dx = dx;
inp.dy = dy;
inp.mouseData = 0;
inp.dwFlags = Jiggler.MOUSEEVENTF_MOVE;
inp.time = 0;
inp.dwExtraInfo = (IntPtr)0;
if (SendInput(1, ref inp, 28) != 1)
throw new Win32Exception();
}
}
[StructLayout(LayoutKind.Sequential)]
internal struct INPUT
{
public int TYPE;
public IntPtr dwExtraInfo;
public int dwFlags;
public int dx;
public int dy;
public int mouseData;
public int time;
}
它不会工作,因为 Windows 函数是特定于体系结构的,在本例中是特定于 32 位的。
要使 SendInput
适用于 64 位,请参阅 SendInput and 64bits
然而,GetLastInputInfo
没有等效的 64 位功能,但如果您需要在 64 位中 运行,请参阅 Is there a 64 bit equivalent to GetLastInputInfo / LASTINPUTINFO? 了解如何实现。
我一直在使用 https://github.com/cerebrate/mousejiggler 中的一些代码来防止 Windows PC 闲置。它找到了,但是当我将它移植到一个新的应用程序时,它在执行时开始崩溃。具体在行:
if (SendInput(1, ref inp, 28) != 1)
throw new Win32Exception();
新应用程序 运行 作为 x64 应用程序,而旧应用程序是 x86。为 x86 构建新的应用程序解决了这个问题。完整代码如下。我正在努力弄清楚为什么会这样。支柱中有一个 IntPtr
会根据平台从 4 字节变为 8 字节,但据我所知,没有办法改变它。我想我可以创建一个 32 位 int 指针并使用不安全代码,但我什至不确定这是否真的是问题所在。
关于如何针对 x64 平台修复它的任何想法?
[StructLayout(LayoutKind.Sequential)]
struct LASTINPUTINFO
{
public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
[MarshalAs(UnmanagedType.U4)]
public UInt32 cbSize;
[MarshalAs(UnmanagedType.U4)]
public UInt32 dwTime;
}
[DllImport("user32.dll")]
static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
static uint GetLastInputTime()
{
uint idleTime = 0;
LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
lastInputInfo.dwTime = 0;
uint envTicks = (uint)Environment.TickCount;
if (GetLastInputInfo(ref lastInputInfo))
{
uint lastInputTick = lastInputInfo.dwTime;
idleTime = envTicks - lastInputTick;
}
return ((idleTime > 0) ? (idleTime / 1000) : 0);
}
public static class Jiggler
{
internal const int INPUT_MOUSE = 0;
internal const int MOUSEEVENTF_MOVE = 0x0001;
[DllImport("user32.dll", SetLastError = true)]
private static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize);
public static void Jiggle(int dx, int dy)
{
var inp = new INPUT();
inp.TYPE = Jiggler.INPUT_MOUSE;
inp.dx = dx;
inp.dy = dy;
inp.mouseData = 0;
inp.dwFlags = Jiggler.MOUSEEVENTF_MOVE;
inp.time = 0;
inp.dwExtraInfo = (IntPtr)0;
if (SendInput(1, ref inp, 28) != 1)
throw new Win32Exception();
}
}
[StructLayout(LayoutKind.Sequential)]
internal struct INPUT
{
public int TYPE;
public IntPtr dwExtraInfo;
public int dwFlags;
public int dx;
public int dy;
public int mouseData;
public int time;
}
它不会工作,因为 Windows 函数是特定于体系结构的,在本例中是特定于 32 位的。
要使 SendInput
适用于 64 位,请参阅 SendInput and 64bits
然而,GetLastInputInfo
没有等效的 64 位功能,但如果您需要在 64 位中 运行,请参阅 Is there a 64 bit equivalent to GetLastInputInfo / LASTINPUTINFO? 了解如何实现。