如题
想制作一个文本采集助手程序。该程序的功能是自动复制文本编辑器或网页上(凡是可以高亮选取的)的文本到剪贴板。实现方法是每隔一段时间就执行系统的复制命令。如果是手动的话,我们知道安Ctrl+C可以实现。在任何的windows程序里,这都是通用的。我知道可以用sendkey "^c" 或 模拟键盘事件 keybd_event。但这只不过不是人工按键罢了,实际上还是要执行背后的真正命令。我想知道,能不能用vb实现直接发出复制命令,而不是模拟按键。不用sendkey或keybd_event,也不是Clipboard.SetText(这个好像只能操作程序本身的某个控件里的信息)。
求求高手帮忙!困扰很久了,寝食难安啊!
回答好的会加分,至少加50!拜托了,只为了撞分的就别回答了,以提高知道的质量
是否可以用 SendMessage ( hwnd,WM_COPY,0,0)? 我试过,没反应,不知该怎么用
________________
#1:额……sendmessage的用法应该没问题,hwnd是怎么抓的?
A:这是个问题。我原来用GetForegroundWindow,有位高手说那样不行。要取得当前获得焦点的“子窗体”的句柄要GetCursorPos+WindowFromPoint。是不是要直接发送复制命令的话,就唯有从sendmessage下手了?
求救!用VB怎么实现和按Ctrl+C(复制)一样的效果(不用sendkey或keybd_event)?
答案:1 悬赏:60 手机版
解决时间 2021-02-14 19:29
- 提问者网友:沉默菋噵
- 2021-02-13 19:32
最佳答案
- 五星知识达人网友:举杯邀酒敬孤独
- 2021-02-13 20:59
额……sendmessage的用法应该没问题,hwnd是怎么抓的?
A:这是个问题。我原来用GetForegroundWindow,有位高手说那样不行。要取得当前获得焦点的“子窗体”的句柄要GetCursorPos+WindowFromPoint。是不是要直接发送复制命令的话,就唯有从sendmessage下手了?
RE:嗯,getforegroundwindow配合FindWindowEx使用吧,复制不是Sendmsg就是postmsg,sendmsg是没错的
google到了一段代码,大意是使用当前激活窗体的句柄发一个GetFocus,同样得到当前激活控件的句柄,并把功能封在GetFocusEx里,c++的代码,不改vb了,应该看得懂,所用API:
GetWindowLong,SetWindowLong,GetFocus,SendMessage
,RegisterWindowMessage,CallWindowProc,GetForegroundWindow
所以说是个很闹心的东西
static WNDPROC g_pOldWndProc = NULL;
static UINT g_uGetFocusMessage = RegisterWindowMessage(_T("SpecialGetFocusMessage"));
static LRESULT WINAPI GetFocusWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ if(uMsg == g_uGetFocusMessage) { return (LRESULT)GetFocus(); } else { return CallWindowProc(g_pOldWndProc, hWnd, uMsg, wParam, lParam); }}
HWND GetFocusEx()
{ HWND hWnd = GetForegroundWindow();
if(!IsWindow(hWnd)) return NULL;
g_pOldWndProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC); SetWindowLong(hWnd, GWL_WNDPROC, (LONG)GetFocusWindowProc);
HWND hResult = (HWND)SendMessage(hWnd, g_uGetFocusMessage, 0, 0); SetWindowLong(hWnd, GWL_WNDPROC, (LONG)g_pOldWndProc);
g_pOldWndProc = NULL;
return hResult;}
A:这是个问题。我原来用GetForegroundWindow,有位高手说那样不行。要取得当前获得焦点的“子窗体”的句柄要GetCursorPos+WindowFromPoint。是不是要直接发送复制命令的话,就唯有从sendmessage下手了?
RE:嗯,getforegroundwindow配合FindWindowEx使用吧,复制不是Sendmsg就是postmsg,sendmsg是没错的
google到了一段代码,大意是使用当前激活窗体的句柄发一个GetFocus,同样得到当前激活控件的句柄,并把功能封在GetFocusEx里,c++的代码,不改vb了,应该看得懂,所用API:
GetWindowLong,SetWindowLong,GetFocus,SendMessage
,RegisterWindowMessage,CallWindowProc,GetForegroundWindow
所以说是个很闹心的东西
static WNDPROC g_pOldWndProc = NULL;
static UINT g_uGetFocusMessage = RegisterWindowMessage(_T("SpecialGetFocusMessage"));
static LRESULT WINAPI GetFocusWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{ if(uMsg == g_uGetFocusMessage) { return (LRESULT)GetFocus(); } else { return CallWindowProc(g_pOldWndProc, hWnd, uMsg, wParam, lParam); }}
HWND GetFocusEx()
{ HWND hWnd = GetForegroundWindow();
if(!IsWindow(hWnd)) return NULL;
g_pOldWndProc = (WNDPROC)GetWindowLong(hWnd, GWL_WNDPROC); SetWindowLong(hWnd, GWL_WNDPROC, (LONG)GetFocusWindowProc);
HWND hResult = (HWND)SendMessage(hWnd, g_uGetFocusMessage, 0, 0); SetWindowLong(hWnd, GWL_WNDPROC, (LONG)g_pOldWndProc);
g_pOldWndProc = NULL;
return hResult;}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯