在远程桌面会话中编程获取文件内容数据(复制到本地剪贴板)

4

这是我需要完成的任务:

  1. 用户打开远程桌面会话 (RD Web Access / Remote apps)
  2. 用户在本地 PC 上通过资源管理器复制文件 (CTRL+C)
  3. 用户点击我们应用程序中的一个按钮(在 RD 会话中运行),然后将文件复制(粘贴)到服务器上已知的目录

手动在远程文件资源管理器中执行复制/粘贴操作可以完美执行,但以编程方式从远程会话访问剪贴板内容时,我只能通过“FileGroupDescriptorW”格式获取文件列表(不包括本地路径)。

我知道这是正常现象,并阅读了 MSN 的“RDP - 剪贴板虚拟通道扩展”文档。

我认为唯一的解决方案是使用剪贴板虚拟通道的“格式内容请求PDU”和“格式内容响应PDU”请求文件内容。

问题是我不知道如何在 Delphi 中实现此功能(或任何其他语言,因为我无法在网络上找到任何代码示例)。

那么我该如何从 RD 会话中以编程方式访问剪贴板虚拟通道并流式传输文件内容?非常感谢提供代码示例(如果有 Pascal/Delphi 示例,则更佳)。

谢谢!


1
我个人认为,你最好保持中立,并将其作为一个纯的winapi问题,以吸引更广泛的观众。 - David Heffernan
我已经按照您的建议更改了标签。谢谢。 - Vincent
1个回答

0

我曾经用一个小的VB脚本解决了这个问题。

这个脚本可以由您的Delphi应用程序生成和启动。

My_Destination\Folder是目标文件夹,Folder是打开的目标窗口的名称,Copying...是显示复制文件时进度条窗口的名称。

Set objshell = Wscript.CreateObject("WScript.Shell")

objshell.Run "cmd.exe /C start " & "My_Destination\Folder"


success = objshell.AppActivate("My_Destination\Folder")
WScript.Sleep 500

objshell.Sendkeys "%HV"

Set oShell = CreateObject("WScript.Shell") 
WScript.Sleep 3000
Do 
   If (oShell.AppActivate("Copying...") = False) Then
      If oShell.AppActivate("Folder") Then
         WScript.Sleep 500
         oShell.SendKeys "%{F4}"
      End If
      WScript.Sleep 3000
      Exit Do
   Else
      WScript.Sleep 3000
   End If
Loop

第一行代码打开目标文件夹的资源管理器窗口。 一旦窗口被激活,你可以发送模拟粘贴操作的按键(粘贴:%HV)。

最后一部分等待复制操作的终止,然后关闭打开的窗口。

注意:Copying... 窗口名称和按键序列(%HV)与语言相关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接