测试了一下,在VFP中使用Win32 API中获取系统剪贴板的内容,存在一个技术问题,即无法(方便地)把远程内存中的句柄块强制转换为VFP中的字符串,所以暂时使用中介的办法,用C写了一个外部小程序,获取剪贴板中的内容储存为一个文本文件,再让VFP中的编辑控件读取,不足之处是画面会闪现RUN黑屏(不能取消,因为必须等待程序执行完成才能进行下一动作),这个调用外部程序的行为在VFP中速度稍有点慢(但肯定比启动Word快得多,也不会遗留进程在内存中),不知你是否能够忍受。
那个控件使用如下的类代码创建即可:
程序代码:
DEFINE CLASS myEditBox AS EditBox
#DEFINE K_CTRL_ENTER 10
PROCEDURE Keypress(tnKeyCode, tnShiftAltCtrl)
LOCAL lcText
IF (tnKeyCode == K_CTRL_ENTER) .AND. (tnShiftAltCtrl == 2)
* 定义按CTRL+ENTER组合键获取剪贴板内容
RUN GetClipboardText && 执行外部GetClipboardText.exe程序
lcText = FILETOSTR("Clipboard.txt") && Clipboard.txt是GetClipboardText.exe生成的文本文件
IF !EMPTY(lcText)
This.Value = lcText
ELSE
MESSAGEBOX("当前剪贴板中没有内容", 64, ThisForm.Caption, 2000)
ENDIF
This.SetFocus
ENDIF
ENDPROC
#UNDEFINE K_CTRL_ENTER
ENDDEFINE
附件不是zip压缩包,把扩展名.zip删掉即可。用VC11写成,需要vc110运行库,启动时若报缺少运行库把文件名告诉我,另外上传。
以下是该C程序的源代码,如果嫌复杂,自己找个C编译器重新创建一个可执行程序即可:
程序代码:
#include <Windows.h>
#include <clocale>
#include <cstdio>
void SaveToFile(const wchar_t* filename, const wchar_t* text);
void wmain(void)
{
setlocale(LC_ALL, "chs");
if (OpenClipboard(NULL))
{
wchar_t* text = (wchar_t*)GetClipboardData(CF_UNICODETEXT);
SaveToFile(L"Clipboard.txt", text);
EmptyClipboard();
CloseClipboard();
}
}
void SaveToFile(const wchar_t* filename, const wchar_t* text)
{
FILE* file;
if (_wfopen_s(&file, filename, L"wt") == 0)
{
fwprintf_s(file, L"%s", (text != NULL) ? text : L"");
fclose(file);
}
}
[
本帖最后由 TonyDeng 于 2012-12-15 03:27 编辑 ]