Java 如何在JNI调用中使用windows.h setClipboardContent方法?

Java 如何在JNI调用中使用windows.h setClipboardContent方法?,java,winapi,java-native-interface,Java,Winapi,Java Native Interface,我正在实现一个JNI方法,该方法调用windows.h中的setClipboardContent函数来设置windows剪贴板内容。标题如下所示。formatName是剪贴板格式,数据是Java中的字节[]。它是您要放入剪贴板的数据 我对如何在JNI方法中调用setClipboardContent函数感到困惑。有人能帮忙吗 JNIEXPORT jboolean JNICALL Java_msoffice_MSOfficeClipboard_setClipboardContents(JNIEnv

我正在实现一个JNI方法,该方法调用windows.h中的setClipboardContent函数来设置windows剪贴板内容。标题如下所示。formatName是剪贴板格式,数据是Java中的字节[]。它是您要放入剪贴板的数据

我对如何在JNI方法中调用setClipboardContent函数感到困惑。有人能帮忙吗

JNIEXPORT jboolean JNICALL Java_msoffice_MSOfficeClipboard_setClipboardContents(JNIEnv *pEnv, jobject, jstring formatName, jbyteArray data)
{
    BOOL fSucces =  OpenClipboard(NULL);
        if (fSucces) {
            EmptyClipboard(); 
            const char *str = pEnv->GetStringUTFChars(formatName, NULL);
            if (str = NULL) return false; /* OutOfMemoryError already thrown */
            UINT format = RegisterClipboardFormat(str);

            pEnv->ReleaseStringUTFChars(formatName, str);

            // This is where I should call setClipboardContent(format, HANDLE) method. I don't know what to do here.

            CloseClipboard();       
      }

      return fSucces;

}

假设剪贴板格式只是一个数据块,您需要分配一块具有GlobalAllocGMEM\u MOVEABLE的内存,并从数据数组中复制数据。某些剪贴板格式需要特殊行为CF_位图需要HBITMAP等。

您计划从何处获取句柄?为了调用setClipboardContents函数,我需要提供数据句柄。现在,我对如何创建句柄而不是指针感到困惑。我是winapi.HANDLE winapi SetClipboardData的新手,在UINT uFormat中,在opt HANDLE hMem中;GlobalAlloc为您提供了传递给SetClipboardData的句柄;正如我所说,这只适用于内存块格式。嗨@Luke,请您看看上面新粘贴的代码好吗?memcpy语句引发错误。应根据需要取消注释GlobalLock和GlobalUnlock行。然后将memcpy转换为字节,这些字节不应该是const而不是dataHandle。