假如有另一个进程的窗口A,已得到其句柄为 handle在窗口A为非激活的状态下,我如何才能在我的程序中通过发消息模拟“Ctrl+V"
从而把系统剪贴板中的数据粘贴给窗口A
最好在这个过程中,保持窗口A 为非激活状态
我用过
::keybd_event(VK_CONTROL,0,0,0);
::keybd_event(86,0,0,0);
::keybd_event(86,0,KEYEVENTF_KEYUP,0);
::keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);但一定要窗口A在激活的情况下在能达到上面所说的效果
从而把系统剪贴板中的数据粘贴给窗口A
最好在这个过程中,保持窗口A 为非激活状态
我用过
::keybd_event(VK_CONTROL,0,0,0);
::keybd_event(86,0,0,0);
::keybd_event(86,0,KEYEVENTF_KEYUP,0);
::keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);但一定要窗口A在激活的情况下在能达到上面所说的效果
::keybd_event(86,0,0,0);
::keybd_event(86,0,KEYEVENTF_KEYUP,0);
::keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);程序不能保证这几个消息之间没有其他的消息插进来,如果有,那好,你接收到的就是分开的ctrl和v的按键消息,这对你毫无用处,准确的做法 SendMessage(hWnd, WM_PASTE, 0, 0)
快结贴,给我分!!!!!!!
A是不预知的
如果不把其激活的话又怎能获得它的编辑框呢?
况且,不是每个能输入的窗口都是标准的EDIT 控件,如WORD的编辑窗口就不是了
我可是对你这个帖子很关注啊,你可别不给分啊
鬼知道我的程序的窗口的下一个窗口会是怎么一个窗口?
我想把它做到有一个通用性,即是,不管其是什么窗口,只要光标能在其中闪动,就向它发送字符
我做的是一个输入法,其它的都做好了就差这个我也试了一个方法了的,就是用上面的keybd_event(),keybd_event()只对前台窗口有效
即是说,我要把我的窗口的下一个窗口设为前台窗口,再用keybd_event()用完后,再把我的窗口
设回前台,麻烦的很,且在这样的搞来搞来中,窗口们闪得利害还有的是,有时候行,有时候不行晕死
我也想改变这个事实
试个全局HOOK了
不过问题多,只好退而求其次
::keybd_event(VK_CONTROL,0,0,0);
::keybd_event(86,0,0,0);
::keybd_event(86,0,KEYEVENTF_KEYUP,0);
::keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
::GetWindowRect(hDlg,&theRect);
::SetForegroundWindow(hDlg);
::SetWindowPos(hDlg,HWND_TOPMOST,theRect.left,theRect.top,theRect.right- theRect.left,theRect.bottom-theRect.top,SWP_NOACTIVATE);
在这段代码之前,我已把文本放入系统剪贴板中
我想在我的程序中把剪贴板中的文本数据发送到记事本程序中
我先取得了记事本窗口的句柄(hNextWindow),之后将其设置为前台窗口,接着用
keybd_event()模拟Ctrl+V 把系统剪贴板中的文本粘贴过去
四个keybd_event()函数之后再将我的程序(句柄为 hDlg )设置为前台结果是有时把文本贴过去了,有时不行,(测试过遍了还是这样,系统剪贴板方面没问题的)我觉得好像是keybd_event()把消息发到系统里去后,记事本还没来得及处理,我的程序就已成为了前台窗口,导致一个或两个keybd_event()函数作用在我的程序上,而不是记事本中是这样的么,郁闷中。你先看一下这个贴子我重了一下,问题可能就像我所说的 “我觉得好像是keybd_event()把消息发到系统里去后,记事本还没来得及处理,我的程序就已成为了前台窗口,导致一个或两个keybd_event()函数作用在我的程序上,而不是记事本中“
因为我把第四个keybd_event()函数之后的语去掉后,即不把我的窗口重新设为前台
那么,每一次粘贴都成功了
能在第四个keybd_event()之后暂停一下么,即等keybd_event()们都处理完后,再把我的窗口设为前台
嘿嘿,那没办法了,
vc 有sleep()么?