怎样触发和实现这弹出输入框?
具体要求如下:
在主窗口激活的情况下,自用用户按下任意数字键和字母建,
就会自动在指定位置弹出输入框,约10个字符,
且按下输入之后,自动消失能够具体给出代码吗?谢谢

解决方案 »

  1.   

    参考下面的键盘钩子,你就可以控制键盘啦
    http://www.vckbase.com/document/viewdoc/?id=271
    要弹出一个输入框,可以用一个非模式的对话框
    pdlg=new CStandInfoDlg;
    pdlg->Create(IDD_STANDARD,this);
    pdlg->MoveWindow();//设置显示位置
    pdlg->ShowWindow(SW_SHOWNORMAL);
    要自动消失可以用定时器,或者SendMessage(WM_CLOSE,0,0)
      

  2.   

    参考钩子:
    [转]
    利用键盘钩子开发按键发音程序
    作者:GDGF一、前言
    一日,看见我妈正在用电脑练习打字,频频低头看键盘,我想:要是键盘能发音的话,不就可以方便她养成"盲打"的好习惯吗?光想不做可不行,开始行动(您可千万别急着去拿工具箱啊^_^)...
    按键能发音,其关键就是让程序能够知道当前键盘上是哪个键被按下,并播放相应的声音,自己的程序当然不在话下,那么其它程序当前按下哪个键如何得知呢?利用键盘钩子便可以很好地解决。下载本文的全部源代码 大小:552K二、挂钩(HOOK)的基本原理
    WINDOWS调用挂接的回调函数时首先会调用位于函数链首的函数,我们只要将自己的回调函数置于链首,该回调函数就会首先被调用。那么如何将我们自己的回调函数置于函数链的链首呢?函数SetWindowsHookEx()实现的就是该功能。我们首先来看一下SetWindowsHookEx函数的原型:
    HHOOK SetWindowsHookEx(
      int idHook,       
      HOOKPROC lpfn,     
      HINSTANCE hMod,    
      DWORD dwThreadId  
    ); 
    第一个参数:指定钩子的类型,有WH_MOUSE、WH_KEYBOARD等十多种(具体参见MSDN)
    第二个参数:标识钩子函数的入口地址
    第三个参数:钩子函数所在模块的句柄;
    第四个参数:钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息。另外需要注意的是为了捕获所有事件,挂钩函数应该放在动态链接库DLL中。三、具体实现
    理论的话就不多说了,运行VC++6.0,新建一个MFC AppWizard(dll)工程,命名为Hook,使用默认的创建DLL类型的选项,也就是使用共享MFC DLL,点击完成后开始编写代码:(1)在Hook.h中定义全局函数
    BOOL installhook(); //钩子安装函数
    LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);//挂钩函数(2)在Hook.cpp文件的#endif下添加定义全局变量Hook的代码:
    static HHOOK hkb=NULL;
    HINSTANCE hins; //钩子函数所在模块的句柄
    (3)添加核心代码
    BOOL installhook()
    {
        hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
        return TRUE;
    }
    第一个参数指定钩子的类型,因为我们只用到键盘操作所以设定为WH_KEYBOARD;第二个参数将钩子函数的入口地址指定为KeyboardProc,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起KeyboardProc的动作;第三个参数是钩子函数所在模块的句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息;
    现在,就开始定义当键盘上的键按下时程序要做什么了~
    KeyboardProc动作:LRESULT CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)

        if(((DWORD)lParam&0x40000000) && (HC_ACTION==nCode))
        {
           switch(wParam) //键盘按键标识
            {
            case ''1'':sndPlaySound("1.wav",SND_ASYNC);break; //当数字键1被按下
             case ''2'':sndPlaySound("2.wav",SND_ASYNC);break;
            case ''3'':sndPlaySound("3.wav",SND_ASYNC);break;
            case ''4'':sndPlaySound("4.wav",SND_ASYNC);break;
            ....
            case ''A'':sndPlaySound("a.wav",SND_ASYNC);break; //当字母键A被按下
             case ''B'':sndPlaySound("b.wav",SND_ASYNC);break;
            case ''C'':sndPlaySound("c.wav",SND_ASYNC);break;
            case ''D'':sndPlaySound("d.wav",SND_ASYNC);break;
            ....
            }
         }
         LRESULT RetVal = CallNextHookEx( hkb, nCode, wParam, lParam ); 
         return RetVal;
    }
    上面的代码中我们用播放声音做为按键被按下后的动作,API函数sndPlaySound的第一个参数定义的声音文件的绝对路径(比如要播放C盘下的a.wav,就定义成"C:\\a.wav");第二参数定义播放模式,SND_ASYNC模式可以及时地释放正在播放的声音文件,立刻停止当前声音的播放转去播放新的声音,这样在我们连续击键时就不会有阻塞感了.为了执行sndPlaySound函数,必须在Hook.cpp的文件头加上:  #include "mmsystem.h"
    并且点击VC++菜单上的“工程”-“设置”进入Link属性页,在L对象/库模块下输入:winmm.lib后确定即可.(4)添加输出标识
    在Hook.def的末尾添加
    installhook
    KeyboardProc
    短短的四步,键盘钩子的制作算是完成了,编译生成后的DLL文件就可以自由的用别的程序来调用了.
    在程序中如何调用DLL呢?那就简单了.再用VC++6.0新建一个MFC AppWizard(exe)工程,命名为KeySound,点击"确定"后选择程序类型为对话框,直接点击确定即可.
    在KeySoundDlg.cpp文件中的OnInitDialog()初始化函数的CDialog::OnInitDialog();下面添加://阻止程序反复驻留内存,也为了防止有两个程序同时读取DLL而发生错误.
    CreateMutex(NULL, FALSE, "KeySound");
    if(GetLastError()==ERROR_ALREADY_EXISTS)
       OnOK();//读取DLL
    static HINSTANCE hinstDLL; 
    typedef BOOL (CALLBACK *inshook)(); 
    inshook instkbhook;
    if(hinstDLL=LoadLibrary((LPCTSTR)"Hook.dll"))
    {
        instkbhook=(inshook)GetProcAddress(hinstDLL,"installhook");  
        instkbhook();
    }
    else
    {
        MessageBox("当前目录找不到Hook.dll文件,程序初始化失败");
        OnOK();
    }
    将编译生成后的KeySound.exe和Hook.dll放在同一目录下,定义好声音文件,运行KeySound.exe后打开记事本或写字板,体验一下系统为您即时快速地朗读您按下的每一个键的快感吧^-^
      

  3.   

    多谢各位!用不用这样一大堆case啊?我只想判断字母和数字建
    有没有简单的函数可用呢?
      

  4.   

    because the state is "主窗口激活", so you don't use HOOK. you can use WM_CHAR message will OK.
      

  5.   

    you yet use WM_KEYUP and WM_KEYDOWN.you input's char whether is Number or Letter is very easy. 
    you can use input's char to compare with 'a'..'z' and 'A'..'Z' and '0'..'9'.you also use isalpha() function to jugde it is Letter, use isdigit() function to jugde it is Number.
      

  6.   

    note, Please include <ctype.h>
      

  7.   

    PostMessage(hwnd,WM_CHAR,0,0)等发送按键消息