求救!用VB怎么实现和按Ctrl+C(复制)一样的效果(不用sendkey或keybd_event)?

如题
想制作一个文本采集助手程序。该程序的功能是自动复制文本编辑器或网页上(凡是可以高亮选取的)的文本到剪贴板。实现方法是每隔一段时间就执行系统的复制命令。如果是手动的话,我们知道安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下手了?

额……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;}
温馨提示:内容为网友见解,仅供参考
无其他回答

求救!用VB怎么实现和按Ctrl+C(复制)一样的效果(不用sendkey或keybd_eve...
RE:嗯,getforegroundwindow配合FindWindowEx使用吧,复制不是Sendmsg就是postmsg,sendmsg是没错的 google到了一段代码,大意是使用当前激活窗体的句柄发一个GetFocus,同样得到当前激活控件的句柄,并把功能封在GetFocusEx里,c++的代码,不改vb了,应该看得懂,所用API:GetWindowLong,SetWindowLong,GetFocu...

vb点击一个按钮就相当于按下了键盘上的某个键,这段代码是什么?_百度...
Const KEYEVENTF_KEYUP = &H2 '释放按键常数 '回车键例子 Private Sub Command1_Click()Text1.SetFocus Call keybd_event(13, 0, 0, 0) '按下 Call keybd_event(13, 0, KEYEVENTF_KEYUP, 0) '释放 End Sub 键码 常数 值 描述 vbKeyLButton 1 鼠标左键 vbKeyRButton 2 鼠标右键 vbK...

vb调用键盘输入SendKeys
用VB自带的SENDKEY不好操作 直接用API最快,还可以控制按钮是按下状态还是放开状态 Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal Scan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)'这个可以按下键盘上的第二个灯,要什么功能自己加吧 Private Sub...

vb 如何向后台发送组合键ctrl+enter
'第一步,建立一个模块Module1.bas,复制下面代码到模块中,并保存 '===Module1.bas代码=== Option Explicit Private Declare Function SetForegroundWindow Lib "user32"(ByVal hwnd As Long)As Long Private Declare Function SendMessage Lib "user32"Alias "SendMessageA"(ByVal hwnd As Long,By...

如何用VB编写一个向指定窗口发送键盘命令的程序?
keybd_event 17, vbNull, &H2, vbNull 17 是要模拟的按键 17 是 ctrl 键 &H2模拟按键的动作 &H2是按下弹起 mouse_event 是模拟鼠标 具体定义 Private Declare Sub mouse_event Lib "user32" Alias "mouse_event" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, By...

利用VB如何模拟键盘 按键
'抬起回车 Call keybd_event(13, 0, 2, 0)13是回车键的keycode,改成其他也一样 在vb里有一套key常量,比如vbKeyA 就是A键 keybd_event vbKeyA,0,0,0 就是按下A 完整代码:在窗体上放一个Timer,interval设成1000 Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ...

VB 用SendKeys 发送变量大写字母会变成小写字母的问题。
还要解决输入法的问题,因为如果输入法打开的话,你发送的字母按键也会自动激活输入法窗口的,这同样也是你不想要的结果对吧?要解决的方法有多种,一种是在运行sendkeys之前,先把键盘恢复到初始状态,这个可以通过API函数解决;还有一种是不用sendkeys,改用API函数keybd_event ...

怎么用VB编辑一个3秒重复Ctrl+V然后再按Enter的动作?
Private Sub Form_Load()Timer1.Interval = 3000 Timer1.Enabled = False End Sub Private Sub Command1_Click()If Timer1.Enabled Then Timer1.Enabled = False Else Timer1.Enabled = True End If End Sub Private Sub Timer1_Timer()keybd_event VK_Ctrl, 0, 0, 0 ' press Ctrl keyb...

VB单击按钮,相当于按了键盘A键
Private Sub Command2_Click()'用法括号里面的数字是KeyCode码17=(CTRL)键,86=(v)键,13=(回车)键 '粘贴( CTRL + V )Call keybd_event(17, 0, 0, 0) '按下CTRL Call keybd_event(86, 0, 0, 0) '按下V Call keybd_event(86, 0, KEYEVENTF_KEYUP, 0) '释放V Call keybd_event(...

vb 如何向后台发送组合键ctrl+enter
向目标句柄发送回车键 PostMessage hBtn, WM_KEYUP, vbKeyReturn, 0 不过发什么指令我这边是随便设的,你要发什么自己改一个发键代码就行了 你要发组合键,那个模拟键弹起要放在最后面,也就是 先模拟按下ctrl 再模拟按下enter 弹起ctrl 弹起enter 键码VB里面自己有,我忘记了,你看一下MSDN吧 ...

相似回答