我把一段文字存入剪切版,然后找到光标所在窗口,利用热键发送WM_PASTE消息。我发现当光标在IE的地址栏,纪事本等位置时可以成功,但是光标在word或者Outlook等地方时就没有反应。请问如何模拟ctrl+V的这一过程,使我所注册的系统热键,也能够将文字发送到所有窗口,谢谢。

解决方案 »

  1.   

    试试这个消息
    WM_COPYDATA 
      

  2.   

    你定义的热键跟word有冲突没有?
      

  3.   

    keybd_event(VK_CONTROL,0,0,0);
    keybd_event(VK_P,0,0,0);
      

  4.   

    SendMessage(hWnd, WM_PASTE,0,0);如果是要发送到多个窗口的话,按照窗口Handle进行循环。
      

  5.   

    akirya 
    坏[长期潜水中,勿扰] 
    等 级:
     发表于:2008-01-14 16:20:261楼 得分:0 
    试试这个消息 
    WM_COPYDATA   貌似不行。
     
       
     
    Mackz 
    在相互 
    等 级:
     发表于:2008-01-14 18:05:052楼 得分:0 
    不同程序处理的消息可能不一样。 可是在word,OE这种地方ctrl+v是管用的阿。 
       
     
    jinghao666666 
    高手是写出来的!!! 
    等 级:
     发表于:2008-01-14 20:09:273楼 得分:0 
    你定义的热键跟word有冲突没有? 
    肯定没有的。 
       
     
    jh2005 
     
    等 级:
     发表于:2008-01-14 21:41:594楼 得分:0 
    keybd_event(VK_CONTROL,0,0,0); 
    keybd_event(VK_P,0,0,0); 
    兄台什么意思? 
     
       
     
    sjdev 
    着意寻香不肯香,香在无寻处. 
    等 级:
     发表于:2008-01-14 21:44:445楼 得分:0 
    SendMessage(hWnd,   WM_PASTE,0,0); 如果是要发送到多个窗口的话,按照窗口Handle进行循环。 
    没有太明白的说。 
     
     
      

  6.   

    贴一下我的函数,很简单的。void InputTextByClipBoard()
    {
        HWND hwnd1 = ::GetForegroundWindow();    DWORD ThreadId1,ThreadId2,ProcessId2;    //   Get thread ID of spercific window
        ThreadId2 = ::GetWindowThreadProcessId(hwnd1,&ProcessId2);    //   Get thread ID of current thread
        ThreadId1 = ::GetCurrentThreadId();    //   Binding the input of two thread
        ::AttachThreadInput(ThreadId1,ThreadId2,TRUE);    //   Get input focus
        HWND hwnd = ::GetFocus();    ::SendMessage(hwnd, WM_PASTE, 0, 0);
    }
      

  7.   

    模拟Ctrl-v的做法,需要什么?