Racket 如何接受放在球拍画布上的剪贴板数据

Racket 如何接受放在球拍画布上的剪贴板数据,racket,Racket,我正在使用Racket编写一个UI应用程序,希望能够从其他应用程序中拖放项目,例如图像。具体来说,我想从浏览器(如Chrome或FF)中的网页中拖动一幅图像,并将其放到应用程序中的canvas%上,从而接收原始图像数据(应用程序将在接受丢弃的图像之前检查PNG元数据) 在canvas%类或超级类上没有直接与剪贴板事件相关的功能(我可以找到) 我熟悉其他框架(如Swing和Win32)中的剪贴板d-n-d 看起来需要的是clipboard%类,但是Racket文档很难将点连接到其中一个窗口类 有什

我正在使用Racket编写一个UI应用程序,希望能够从其他应用程序中拖放项目,例如图像。具体来说,我想从浏览器(如Chrome或FF)中的网页中拖动一幅图像,并将其放到应用程序中的
canvas%
上,从而接收原始图像数据(应用程序将在接受丢弃的图像之前检查PNG元数据)

canvas%
类或超级类上没有直接与剪贴板事件相关的功能(我可以找到)

我熟悉其他框架(如Swing和Win32)中的剪贴板d-n-d

看起来需要的是
clipboard%
类,但是Racket文档很难将点连接到其中一个窗口类

有什么好的教程或示例代码可以参考吗


更新:我查看了clipboard.rkt的Racket源代码(OSX),它似乎只访问“常规”粘贴板。OSX有一个单独的粘贴板用于拖放操作

因此,在OSX上的Racket中似乎不可能使用d-n-d,我将不得不使用Objective-C FFI来实现所需的功能,并将我的用户限制在那些使用Mac的用户


结束这个问题

据我所知,Racket gui库仅通过
canvas%
实现的
window
界面的
accept drop files
on drop file
方法来处理“文件”的拖放。我不熟悉dnd协议,但至少在Linux上,从Firefox拖动的图像不算作文件,因此它们不被接受,而从nautilus拖动的文件则被接受

下面是我用来测试它的小程序:

#lang racket/gui

(define my-canvas%
  (class canvas%
    (define/override (on-drop-file file)
      (printf "got file: ~s\n" file)
      (super on-drop-file file))
    (super-new)))

(define f (new frame% (width 400) (height 400) (label "frame")))
(define c (new my-canvas% (parent f)))
(send c accept-drop-files #t)
(send f show #t)
我建议在网上询问