c# 使用 SetClipboardData 失败 ERROR_INVALID_HANDLE
c# using SetClipboardData fail with ERROR_INVALID_HANDLE
当我尝试使用本机方法将字符串设置到剪贴板时 SetClipboardData
。它失败并使用 GetLastError()
方法得到错误代码 6 ERROR_INVALID_HANDLE
。我不知道它是怎么失败的,这里是代码:
string copyMessage = "need copy to clipboard";
const int GMEM_MOVABLE = 0x0002;
const int GHND = GMEM_MOVABLE;
uint format;
uint bytes;
IntPtr hGlobal = IntPtr.Zero;
format = CF_UNICODETEXT;
byte[] copyMessageBytes = Encoding.Unicode.GetBytes(copyMessage + "[=11=]");
// IMPORTANT: SetClipboardData requires memory that was acquired with GlobalAlloc using GMEM_MOVABLE.
hGlobal = GlobalAlloc(GHND, (UIntPtr)copyMessageBytes.Length);
if (hGlobal == IntPtr.Zero)
{
return false;
}
Marshal.Copy(copyMessageBytes, 0, hGlobal, copyMessageBytes.Length);
if (SetClipboardData(format, hGlobal).ToInt64() != 0) // code fails here
{
// IMPORTANT: SetClipboardData takes ownership of hGlobal upon success.
hGlobal = IntPtr.Zero;
}
else
{
return false;
}
我使用 Marshal.Copy(byte[] source, int startIndex, IntPtr destination, int length)
将字节复制到 hGlobal
,对吗?
在这种情况下,我是否必须使用本机方法 CopyMemory()
来执行此操作?为什么?
感谢
我找到了修复方法。那是因为我按GlobalAlloc()
分配内存,然后需要在复制数据之前调用GlobalLock()
,然后需要在复制后调用GlobalUnlock()
。
当我尝试使用本机方法将字符串设置到剪贴板时 SetClipboardData
。它失败并使用 GetLastError()
方法得到错误代码 6 ERROR_INVALID_HANDLE
。我不知道它是怎么失败的,这里是代码:
string copyMessage = "need copy to clipboard";
const int GMEM_MOVABLE = 0x0002;
const int GHND = GMEM_MOVABLE;
uint format;
uint bytes;
IntPtr hGlobal = IntPtr.Zero;
format = CF_UNICODETEXT;
byte[] copyMessageBytes = Encoding.Unicode.GetBytes(copyMessage + "[=11=]");
// IMPORTANT: SetClipboardData requires memory that was acquired with GlobalAlloc using GMEM_MOVABLE.
hGlobal = GlobalAlloc(GHND, (UIntPtr)copyMessageBytes.Length);
if (hGlobal == IntPtr.Zero)
{
return false;
}
Marshal.Copy(copyMessageBytes, 0, hGlobal, copyMessageBytes.Length);
if (SetClipboardData(format, hGlobal).ToInt64() != 0) // code fails here
{
// IMPORTANT: SetClipboardData takes ownership of hGlobal upon success.
hGlobal = IntPtr.Zero;
}
else
{
return false;
}
我使用 Marshal.Copy(byte[] source, int startIndex, IntPtr destination, int length)
将字节复制到 hGlobal
,对吗?
在这种情况下,我是否必须使用本机方法 CopyMemory()
来执行此操作?为什么?
感谢
我找到了修复方法。那是因为我按GlobalAlloc()
分配内存,然后需要在复制数据之前调用GlobalLock()
,然后需要在复制后调用GlobalUnlock()
。