键盘操作时通过shift+←或者→,实现文本高亮选中的效果,但是在程序中 keybd_event( VK_LSHIFT,0,0,0 );
keybd_event( VK_LEFT,0,0,0 ); keybd_event( VK_LEFT,0,KEYEVENTF_KEYUP,0);
keybd_event( VK_LSHIFT,0,EYEVENTF_KEYUP,0);这样做完后显示时只是光标往左移动了一下,但是没有高亮效果,换成VK_SHIFT也不行,但是这时候我进行“复制”“粘贴”,确实是有选中的文字发送上去,所以不知道是哪儿的问题,求教。谢谢

解决方案 »

  1.   

    http://topic.csdn.net/t/20020103/11/455816.html
      

  2.   


    keybd_event( VK_LSHIFT, MapVirtualKey( VK_LSHIFT, 0 ), 0 , 0 );     // ctrl down
    Sleep(15);
    keybd_event( VK_LEFT, MapVirtualKey(VK_LEFT, 0 ), 0 , 0 );     // enter down
    Sleep(5);
    keybd_event( VK_LEFT, MapVirtualKey(VK_LEFT, 0 ), KEYEVENTF_KEYUP , 0 );  //enter up
    Sleep(15);
    keybd_event( VK_LSHIFT, MapVirtualKey( VK_LSHIFT, 0 ),KEYEVENTF_KEYUP , 0 );  // Alt key up
    Sleep(15);
      

  3.   


    刚才测试了下,我的可以啊,是正常的啊,可以高亮啊显示选中啊void CShiftDlg::OnOK() 
    {
    // TODO: Add extra validation here
    GetDlgItem(IDC_EDIT1)->SetFocus(); keybd_event( VK_LSHIFT, MapVirtualKey( VK_LSHIFT, 0 ), 0 , 0 );     // ctrl down
    Sleep(15);
    keybd_event( VK_LEFT, MapVirtualKey(VK_LEFT, 0 ), 0 , 0 );     // enter down
    Sleep(5);
    keybd_event( VK_LEFT, MapVirtualKey(VK_LEFT, 0 ), KEYEVENTF_KEYUP , 0 );  //enter up
    Sleep(15);
    keybd_event( VK_LSHIFT, MapVirtualKey( VK_LSHIFT, 0 ),KEYEVENTF_KEYUP , 0 );  // Alt key up
           Sleep(15);
    }void CShiftDlg::OnSetfocusEdit1() 
    {
    // TODO: Add your control notification handler code here
    int len=m_sEdit.GetLength();
    ((CEdit*)GetDlgItem(IDC_EDIT1))->SetSel(len,len);

    }
      

  4.   


    CEdit控件失去焦点后,选中的文字高亮效果就没了,你可以用SetFocus设置CEdit焦点试试
      

  5.   

    CEdit控件失去焦点后,选中的文字高亮效果就没了,你可以用SetFocus设置CEdit焦点试试
    -----------------------------------------------------------------------
    编辑框勾上No hide selection,或者设置ES_NOHIDESEL 属性
      

  6.   

                    Dim   shiftscan% 
                    shiftscan%   =   MapVirtualKey(VK_SHIFT,   0) 
                    keybd_event   VK_SHIFT,   shiftscan,   0,   0 
                    keybd_event   VK_TAB,   0,   0,   0     
                    keybd_event   VK_TAB,   0,   KEYEVENTF_KEYUP,   0     
                    keybd_event   VK_SHIFT,   shiftscan,   KEYEVENTF_KEYUP,   0 
      

  7.   


    HWND hwnd=::FindWindow("Notepad","新建文本文档.txt - 记事本");
    if (hwnd)
    {
    CWnd *pWnd=FromHandle(hwnd);
    pWnd->SetActiveWindow();
    pWnd->SetWindowPos(FromHandle(HWND_TOPMOST),NULL,NULL,NULL,NULL,SWP_NOSIZE|SWP_NOMOVE);
    hwnd=::FindWindowEx(hwnd,NULL,"Edit",NULL);
    ::PostMessage(hwnd,WM_SETFOCUS,0,0);
    keybd_event( VK_LSHIFT, MapVirtualKey( VK_LSHIFT, 0 ), 0 , 0 );     // ctrl down
    Sleep(15);
    keybd_event( VK_LEFT, MapVirtualKey(VK_LEFT, 0 ), 0 , 0 );     // enter down
    Sleep(5);
    keybd_event( VK_LEFT, MapVirtualKey(VK_LEFT, 0 ), KEYEVENTF_KEYUP , 0 );  //enter up
    Sleep(15);
        keybd_event( VK_LSHIFT, MapVirtualKey( VK_LSHIFT, 0 ),KEYEVENTF_KEYUP , 0 );  // Alt key

    }
    验证有效,不过打开txt后的光标不能在开始的地方。
      

  8.   

    9楼的好像不行啊!我觉得是焦点的问题。你可以把自己的程序设置成无焦点窗口,这样记事本就会一直拥有焦点。模拟按键
    就可以成功了。
    #define WS_EX_NOACTIVATE 0x08000000L  //无焦点
    ::SetWindowLong(m_hWnd,GWL_EXSTYLE, GetWindowLong(m_hWnd,GWL_EXSTYLE)|WS_EX_NOACTIVATE);
    ::SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
      

  9.   

    怎么不行啊?测试通过了,你要将Notepad窗口句柄找到啊,名字肯定要换,我用的“新建文本文档”
      

  10.   

    应该是我窗体焦点的问题,我是这么设置窗体的: BOOL rt = CreateEx(WS_EX_TOPMOST | WS_EX_TOOLWINDOW, 
        AfxRegisterWndClass(CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW, 
    ::LoadCursor(NULL, IDC_ARROW),
    (HBRUSH)::CreateSolidBrush(RGB(254, 254, 254))),
    _T("InputEasy"), 
    WS_POPUP /*| WS_DISABLED*/, 
    0, 0, 0, 0,
    pParentWnd, NULL, NULL);BOOL CMainWnd::PreCreateWindow(CREATESTRUCT& cs)
    {
    BOOL rt = CFrameWnd::PreCreateWindow(cs);
       cs.dwExStyle &= ~WS_EX_CLIENTEDGE; //去掉边框的风格
    //  cs.style &= ~WS_CAPTION;
    // cs.dwExStyle |= 0x08000000;
    return rt;
    }不能设置成 WS_EX_NOACTIVATE 0x08000000L //无焦点,这样窗体就不能处理点击了,上面有很多图片按钮的。
    HWND hwnd=::FindWindow("Notepad","新建文本文档.txt - 记事本");
    这样也不行,因为不确定当前的编辑框是什么窗口,可能是记事本,也可能是UE等编辑窗口。
      

  11.   

    你自己总有办法获得编辑窗口的句柄把?必须让他激活获得焦点Shift+←才关于啊
      

  12.   

    有获取窗口焦点,不然我发送的left事件不会正常响应的,要发送的窗口焦点没问题,功能实现了,就是没有选中效果,实际选中功能是有的。
      

  13.   

    keybd_event( VK_RSHIFT, 0, 0 , 0 );
    keybd_event( VK_LEFT, 0, 0 , 0 );
    keybd_event( VK_LEFT, 0, KEYEVENTF_KEYUP , 0 );
    keybd_event( VK_RSHIFT, 0,KEYEVENTF_KEYUP , 0 );我已经遇到2次这个问题了,VK_RSHIFT可以,而VK_LSHIFT和VK_SHIFT都不可以,原因不详。
      

  14.   

    昨天有看了一下MSDN发现还是参数有问题,下面的用法应该接近真理了:keybd_event( VK_SHIFT, 0x45,KEYEVENTF_EXTENDEDKEY | 0,0 );
    keybd_event( VK_LEFT,  0x45,KEYEVENTF_EXTENDEDKEY | 0,0 );
    keybd_event( VK_LEFT,  0x45,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
    keybd_event( VK_SHIFT, 0x45,KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP,0 );
      

  15.   

    总的理论:发送一个字过去,接着发送 shitf + leftarrow 的组合键到具有焦点的输入框,就可以达到这种选中效果了