WSH访问剪贴板
介绍 我最近进行了一
些Windows脚本主机编程,它的强大功能、特性和灵活性让我感到惊喜。有一件事是我无法从WSH访问剪贴板。在互联网上,我发现了一些解决方案,比如这个基于Internet Explorer自动化的解决方案。这种方法有几个问题,你可以在我的文章中读到关于Internet Explorer自动化:Internet Explorer自动化有什么问题? 使用的代码 在WSH中编写剪贴板内容脚本的解决方案是使用vc++和ATL创建一个常规的COM对象。要安装COM对象,请运行register.bat。 下面是一个使用来自WSH的组件的简单示例: 隐藏,复制Code
var clipboardHelper = null; try { clipboardHelper = WScript.CreateObject("ClipboardHelper.ClipBoard"); } catch (ex) { WScript.Echo(ex.message + "\n\nClipboardHelper library is not properly registered!"); WScript.Quit(1); } var msg = "Some text"; // Put the text into the clipboard. clipboardHelper.SetClipboardText(msg); // Get the text from clipboard. var text = clipboardHelper.GetClipboardText(); WScript.Echo(text);
的兴趣点 实现只是常规的ATL/COM代码。Win32 API函数用于访问剪贴板文本(OpenClipboard, IsClipboardFormatAvailable, GetClipboardData, SetClipboardData, CloseClipboard, GlobalAlloc, GlobalLock, GlobalFree)。 下面是从剪贴板(CF_TEXT和CF_UNICODETEXT格式支持)中检索文本的方法的实现: 隐藏,收缩,复制Code
STDMETHODIMP CClipBoard::GetClipboardText(BSTR* pBstrClipboardText)
{
if (NULL == pBstrClipboardText)
{
return E_INVALIDARG;
}
CComBSTR bstrResult = L"";
if (::OpenClipboard(NULL))
{
if (::IsClipboardFormatAvailable(CF_TEXT) ||
::IsClipboardFormatAvailable(CF_UNICODETEXT))
{
// First try to ge UNICODE text.
BOOL bUnicode = TRUE;
HANDLE hClipboard = ::GetClipboardData(CF_UNICODETEXT);
if (NULL == hClipboard)
{
// If UNICODE text was not available try to get ANSI text.
bUnicode = FALSE;
hClipboard = ::GetClipboardData(CF_TEXT);
}
if (hClipboard != NULL)
{
LPCSTR szClipboardData = (LPCSTR)::GlobalLock(hClipboard);
if (szClipboardData != NULL)
{
if (bUnicode)
{
LPCWSTR szClipboardWText = (LPCWSTR)szClipboardData;
bstrResult = szClipboardWText;
szClipboardWText = NULL;
}
else
{
LPCSTR szClipboardText = (LPCSTR)szClipboardData;
bstrResult = szClipboardText;
szClipboardText = NULL;
}
::GlobalUnlock(hClipboard);
*pBstrClipboardText = bstrResult.Detach();
hClipboard = NULL;
}
else
{
ATLTRACE("GlobalLock failed in CClipBoard::GetClipboardText\n");
}
}
else
{
ATLTRACE("GetClipboardData failed in CClipBoard::GetClipboardText\n");
}
hClipboard = NULL;
}
else
{
ATLTRACE("CF_TEXT NOT available in CClipBoard::GetClipboardText\n");
}
BOOL bRes = ::CloseClipboard();
ATLASSERT(bRes);
}
else
{
ATLTRACE("Can NOT OpenClipboard in CClipBoard::GetClipboardText\n");
}
return S_OK;
}
本文转载于:http://www.diyabc.com/frontweb/news188.html

浙公网安备 33010602011771号