假如有另一个进程的窗口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在激活的情况下在能达到上面所说的效果

解决方案 »

  1.   

    晕,又碰到你发这样的问题了!看见你发我就给你回                   ::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);程序不能保证这几个消息之间没有其他的消息插进来,如果有,那好,你接收到的就是分开的ctrl和v的按键消息,这对你毫无用处,准确的做法                    SendMessage(hWnd, WM_PASTE, 0, 0)
    快结贴,给我分!!!!!!!
      

  2.   

    你为什么非要CTRL+v啊,要不你发送SETTEXT的消息,这样编辑框的内容被全部替换,还有个消息可以是追加字符的,我忘了,你找找
      

  3.   

    那个贴子我是为了方便说明而说了一个记事本的例子
    A是不预知的
    如果不把其激活的话又怎能获得它的编辑框呢?
    况且,不是每个能输入的窗口都是标准的EDIT 控件,如WORD的编辑窗口就不是了
      

  4.   

    如果是要追加数据,你可以先发送GETTEXT消息,在获得的字符串里面加入你要加的字符,然后在发送SETTEXT,麻烦一点!(谁能告诉我追加的消息是什么)
    我可是对你这个帖子很关注啊,你可别不给分啊
      

  5.   

    那不行的,一定要知道句柄才能发送!但对word这样的也有办法,他总有粘贴这个菜单,找到他,对他发生command,理论上说是可以的,具体可能会有麻烦
      

  6.   

    晕,其实我想做的是,向我的程序的窗口的下一个窗口发送字符
    鬼知道我的程序的窗口的下一个窗口会是怎么一个窗口?
    我想把它做到有一个通用性,即是,不管其是什么窗口,只要光标能在其中闪动,就向它发送字符
    我做的是一个输入法,其它的都做好了就差这个我也试了一个方法了的,就是用上面的keybd_event(),keybd_event()只对前台窗口有效
    即是说,我要把我的窗口的下一个窗口设为前台窗口,再用keybd_event()用完后,再把我的窗口
    设回前台,麻烦的很,且在这样的搞来搞来中,窗口们闪得利害还有的是,有时候行,有时候不行晕死
      

  7.   

    手写输入呀,我的程序一定得是前台的
    我也想改变这个事实
    试个全局HOOK了
    不过问题多,只好退而求其次
      

  8.   

    最好先找到一个实例看看,别方向错了就惨了!我敢说真正的输入法不会用ctrl+v的,呵呵,外部程序改动了剪贴板怎么办别人进来看到这个贴会吓一跳,哈哈
      

  9.   

    ::SetForegroundWindow(hNextWindow);
    ::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()们都处理完后,再把我的窗口设为前台
      

  10.   

    我敢说真正的输入法不会用ctrl+v的,呵呵,外部程序改动了剪贴板怎么办
    嘿嘿,那没办法了,
      

  11.   

    但还是有问题的,要是那个程序在你的keybd_event中间加入了比如定时器的消息(完全有可能的)你的ctrl+v就无效了
      

  12.   

    有个兄台说用sleep()
    vc 有sleep()么?
      

  13.   

    sleep()有啊,不过我感觉不好,是很不好!!哈哈,看到楼上的话了吗?你真的可能方向错了!!
      

  14.   

    我以前看过有关WINDOWS IME方面的东西,不过我发现用传统的做输入法的方法做我这个跟本不行我有考虑过全局HOOK把发生在介面上的消息一一截获,以使得其永远成不了前台窗口,不过问题太多了,搞晕,后来放弃了呀
      

  15.   

    哈哈,现在不也问题多多吗!你用keybd_event还怕被插入其他消息呢,严格的说这样你的程序功能并没有实现啊!你还是用SendMessage发送吧,获得另一个程序的句柄后用GetCtrlDlgId什么的获得你要发送的目的地的句柄,具体该发送什么消息你自己看吧
      

  16.   

    那可以用SendMessage  来模拟Ctrl+V 吗?一定要模拟Ctrl+V是因为只要目标程序支持Ctrl+V就行
      

  17.   

    不行,不要使用剪贴板!你有个这样的经历吧!你先复制了一段话,然后你开始输入字符,然后你在复制!要是象你这样处理的话,你复制到的就是当前字符了!那象word这些的剪贴板都没有用了,你好好想吧