求教粘贴板使用方法

diclover 2010-08-13 11:50:46
各位大虾,以下为我是用复制粘贴的方式获取浏览器地址栏文本内容,通过手动使用键盘的ALT + D 然后 ALT + C 的方式可以将所要获取的内容存放到粘贴板,但是用程序实现时发现粘贴板中无任何内容,请各位帮我看看程序中存在什么问题?


BOOL GetURLFromClipboard(HWND hWnd,CString &strURL)
{
//当前浏览器句柄
if(NULL == hWnd)
{
return FALSE;
}

//设置当前浏览器为前端窗体
::SetForegroundWindow(hWnd);

//打开粘贴板
if(FALSE == ::OpenClipboard(hWnd))
{
return FALSE;
}

//清空粘贴板已有数据
EmptyClipboard();

//ALT + D,快捷键获取浏览器地址栏文本
keybd_event(VK_MENU, 0, 0 ,0);
keybd_event('D', 0, 0,0);
keybd_event('D', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU , 0, KEYEVENTF_KEYUP ,0);

//CTRL + C ,快捷键复制文本到粘贴板
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event('C', 0, 0,0);
keybd_event('C', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);

//获取粘贴板数据内存起始地址
HANDLE hClipMemory = ::GetClipboardData(CF_TEXT);
if(NULL == hClipMemory)
{
CloseClipboard();
return FALSE;
}


//锁定粘贴板数据内存
LPBYTE lpClipMemory = (LPBYTE)GlobalLock(hClipMemory);

//使用粘贴板数据内存数据
strURL.Format("%s",lpClipMemory);

//解锁粘贴板内存
GlobalUnlock(hClipMemory);

//关闭粘贴板
CloseClipboard();

return TRUE;
}
...全文
646 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
diclover 2010-08-13
  • 打赏
  • 举报
回复
我按注释掉了粘贴板这部分后打开粘贴板发现粘贴板中有刚获取到的内容,问题可能出现在取粘贴板内存数据的过程中,此外我发现明明调用了EmptyClipboard(),粘贴板中的内容却未被清空,很苦恼啊。

BOOL GetURLFromClipboard(HWND hWnd,CString &strURL)
{
//当前浏览器句柄
if(NULL == hWnd)
{
return FALSE;
}

//设置当前浏览器为前端窗体
::SetForegroundWindow(hWnd);

//打开粘贴板
if(FALSE == ::OpenClipboard(hWnd))
{
return FALSE;
}

//清空粘贴板已有数据
EmptyClipboard();

//ALT + D,快捷键获取浏览器地址栏文本
keybd_event(VK_MENU, 0, 0 ,0);
keybd_event('D', 0, 0,0);
keybd_event('D', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU , 0, KEYEVENTF_KEYUP ,0);

//CTRL + C ,快捷键复制文本到粘贴板
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event('C', 0, 0,0);
keybd_event('C', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);

#if 0
//获取粘贴板数据内存起始地址
HANDLE hClipMemory = ::GetClipboardData(CF_TEXT);
if(NULL == hClipMemory)
{
CloseClipboard();
return FALSE;
}


//锁定粘贴板数据内存
LPBYTE lpClipMemory = (LPBYTE)GlobalLock(hClipMemory);

//使用粘贴板数据内存数据
strURL.Format("%s",lpClipMemory);

//解锁粘贴板内存
GlobalUnlock(hClipMemory);
#endif
//关闭粘贴板
CloseClipboard();

return TRUE;
}


diclover 2010-08-13
  • 打赏
  • 举报
回复
谢谢2、3楼,等待大虾出现,帮顶者均有赏
diclover 2010-08-13
  • 打赏
  • 举报
回复
大家可以用SPY++抓到浏览器句柄hWnd,然后调用我的函数试试,在线等。。。
schlafenhamster 2010-08-13
  • 打赏
  • 举报
回复
你的2个方法我都试了试,都不行(XP)。是不是与机器有关。因为keybd_event已老了
是不是要用SendInput(),不过这个函数很难用。
diclover 2010-08-13
  • 打赏
  • 举报
回复
O(∩_∩)O哈哈~,已解决,谢谢大家支持。解决方法如下:
BOOL GetURLFromClipboard(HWND hWnd,CString &strURL)
{
//当前浏览器句柄
if(NULL == hWnd)
{
return FALSE;
}

//设置当前浏览器为前端窗体
::SetForegroundWindow(hWnd);

//ALT + D
keybd_event(VK_MENU, 0, 0 ,0);
keybd_event('D', 0, 0,0);
keybd_event('D', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU , 0, KEYEVENTF_KEYUP ,0);

Sleep(100);
//CTRL + C
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event('C', 0, 0,0);
keybd_event('C', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);

Sleep(100);

GetDlgItem(IDC_EDIT_URL)->SetWindowText("");
::SendMessage(GetDlgItem(IDC_EDIT_URL)->m_hWnd,WM_PASTE,NULL,NULL);
Sleep(100);
GetDlgItem(IDC_EDIT_URL)->GetWindowText(strURL);
return TRUE;
}
diclover 2010-08-13
  • 打赏
  • 举报
回复
加延时也不行的,现在想法是这样的,用一个编辑框记录,问题转化为如何将光标定位在编辑框中,核心代码如下,光标定位到屏幕左上角去了,导致粘贴失败。

//清空粘贴板内容
if(::OpenClipboard(hWnd))
{
EmptyClipboard();
CloseClipboard();
}

//ALT + D,快捷键选定文本
keybd_event(VK_MENU, 0, 0 ,0);
keybd_event('D', 0, 0,0);
keybd_event('D', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU , 0, KEYEVENTF_KEYUP ,0);

Sleep(100);

//CTRL + C ,快捷键复制
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event('C', 0, 0,0);
keybd_event('C', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);

RECT rt;
GetDlgItem(IDC_EDIT_URL)->SetFocus();
GetDlgItem(IDC_EDIT_URL)->GetClientRect(&rt);
ScreenToClient(&rt);

SetCursorPos(rt.left,rt.top);

GetDlgItem(IDC_EDIT_URL)->SetWindowText("");

//Sleep(500);
//CTRL + V ,粘贴快捷
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event('V', 0, 0,0);
keybd_event('V', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);

GetDlgItem(IDC_EDIT_URL)->GetWindowText(strURL);
schlafenhamster 2010-08-13
  • 打赏
  • 举报
回复
我一般不调:EmptyClipboard()。
zgsdzhaolanxiang1 2010-08-13
  • 打赏
  • 举报
回复
....
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);
Sleep(500);
//获取粘贴板数据内存起始地址
HANDLE hClipMemory = ::GetClipboardData(CF_TEXT);
zgsdzhaolanxiang1 2010-08-13
  • 打赏
  • 举报
回复
关注 。。。
Eleven 2010-08-13
  • 打赏
  • 举报
回复
你的GetURLFromClipboard放到线程函数中去调用,AfxBeginThreadProc,另外在Alt+D和Ctrl+C操作中间加上Sleep(100);一下试试
例如:
// 调用
HWND hWnd = ::FindWindow(_T("IEFRAME"), NULL); //找到IE浏览器
AfxBeginThread(ThreadProc, (LPVOID)hWnd); // 启动线程

UINT __cdecl ThreadProc(LPVOID lParam)
{
HWND hWnd = (HWND)lParam;
CString strURL(_T(""));
GetURLFromClipboard(hWnd, strURL);
AfxMessageBox(strURL);
return 0;
}

BOOL GetURLFromClipboard(HWND hWnd,CString &strURL)
{
//当前浏览器句柄
if(NULL == hWnd)
{
return FALSE;
}

//设置当前浏览器为前端窗体
::SetForegroundWindow(hWnd);

//打开粘贴板
if(FALSE == ::OpenClipboard(hWnd))
{
return FALSE;
}

//清空粘贴板已有数据
EmptyClipboard();

//ALT + D,快捷键获取浏览器地址栏文本
keybd_event(VK_MENU, 0, 0 ,0);
keybd_event('D', 0, 0,0);
keybd_event('D', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_MENU , 0, KEYEVENTF_KEYUP ,0);

Sleep(100);

//CTRL + C ,快捷键复制文本到粘贴板
keybd_event(VK_CONTROL, 0, 0 ,0);
keybd_event('C', 0, 0,0);
keybd_event('C', 0, KEYEVENTF_KEYUP ,0);
keybd_event(VK_CONTROL, 0, KEYEVENTF_KEYUP ,0);

//获取粘贴板数据内存起始地址
HANDLE hClipMemory = ::GetClipboardData(CF_TEXT);
if(NULL == hClipMemory)
{
CloseClipboard();
return FALSE;
}



//锁定粘贴板数据内存
LPBYTE lpClipMemory = (LPBYTE)GlobalLock(hClipMemory);

//使用粘贴板数据内存数据
strURL.Format("%s",lpClipMemory);

//解锁粘贴板内存
GlobalUnlock(hClipMemory);

//关闭粘贴板
CloseClipboard();

return TRUE;
}

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧