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