c#使用SetClipboardData时出现ERROR_INVALID_HANDLE错误

本文关键字:INVALID HANDLE 错误 ERROR 使用 SetClipboardData | 更新日期: 2023-09-27 18:08:49

当我尝试用本地方法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 + "'0");
                // 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()来做到这一点吗?为什么?

Thx

c#使用SetClipboardData时出现ERROR_INVALID_HANDLE错误

我找到了如何修复它。这是因为我通过GlobalAlloc()分配内存,然后需要在复制数据之前调用GlobalLock(),然后需要在复制后调用GlobalUnlock()