我现在出现一个奇怪问题,就是一个edit输入框,CString型,当用扫描枪扫条码,程序判断当edit框的字符达到15个时,自动调用外部一个函数,这时函数没有反应如果我不再edit框中判断EOnChange事件,直接扫描后,按一个按钮,执行的程序和上面自动打印一样,这样就正常,但是这样扫描后,还要按个按钮,太麻烦感觉是调用的那个函数有点问题,但是这个他们不能改,只能我这边想办法,我想能否模拟一下按键动作我就直接在“程序判断当edit框的字符达到15个时”调用那个按钮onbutton(),这样还是不行,非得手工按按钮不行这么奇怪的问题让我摊上了,请问这个怎么处理比较好?

解决方案 »

  1.   

    先将按钮设置为当前焦点,然后发送虚拟按键信息。用SendMessage函数发送消息。
      

  2.   

    edit变量要定义成CEdit(control类型), CString(value类型)不行。
    在EOnChange里
    CString str;
    m_edit.GetWindowText(str);
    if(str.GetLength() == 15)
    {
    Func();
    }
    就可以了
      

  3.   

    是不是因为一个时间差的问题?我也遇到过,这样解释:你直接用程序调用那个函数,程序的执行速度很快,可能是你的某些变量没有来得及传递或者其他什么原因,导致你的button函数没有起作用,但是你手动的点击按钮,和上个函数的结束有一个时间差,结果Button函数正常执行了,所以我建议,你先加个timer看看是不是时间差的问题
      

  4.   

    VOID keybd_event(
      BYTE bVk,               // virtual-key code
      BYTE bScan,             // hardware scan code
      DWORD dwFlags,          // function options
      ULONG_PTR dwExtraInfo   // additional keystroke data
    );
      

  5.   

    我想先试一下“按钮获取焦点,然后模拟回车键按下”这个过程
    我还是在edit的onchange事件中:
    if(strlen(text) ==15) 
            {
                HWND hwnd;
    hwnd = GetDlgItem(IDC_BUTTON3)->m_hWnd;
                    GetDlgItem(IDC_BUTTON3)->SetFocus(); 
    ::SendMessage(hwnd,WM_KEYDOWN,VK_RETURN,0);
             }
    上面焦点可以获取到,但是不能触发按键按下
      

  6.   

    应该不是时间差问题,因为我sleep了,还是一样
      

  7.   

    edit,CString型,你是不是没有updateData(FALSE)吧?
      

  8.   

    SendDlgItemMessage (有个BUTTDOWN消息,就是模拟按下某个按钮的消息,任意的都行,做成钩子,任意的都行,只要知道ID
      

  9.   

    顺便说下,用SendDlgItemMessage 会抢掉Main窗口的焦点,这时如果你在干其他事情,这样发消息很容易让你退出,比如全屏玩DOTA,^-^突然一个模拟按键消息来了,这时候,全屏就没了,所以这个尽量避免用这个消息,最好的方式是SendMessage ,将按键消息弄个WM_USER+ 每次就SendMessage (HWND,WM_USER+,..)这样是最好的方式了,钩子控制不好极其不安全。