我做一个控件,别的什么都不加,只处理它的消息,在WindowProc中加入
switch (message)
{case WM_SETFOCUS:
{
::SendMessage(hwnd,WM_KILLFOCUS,0,0);
::AfxGetMainWnd()->SetFocus();
                   }
}
当然,有多种表示办法!一旦在win98,VB中加载运行后就出错,请问是什么原因呢?
我要实现的功能是不让当前控件能获得焦点,上边代码在WIN2000中实现了功能
,请大家帮帮忙,不会也请UP一下!
原因是:
提示程序执行非法错误,VB6 在 0167:3721e0aa 的模块 CNSMIN.DLL 中导致堆栈错误。
Registers:
EAX=00000001 CS=0167 EIP=3721e0aa EFLGS=00010216
EBX=00702182 SS=016f ESP=00701ffc EBP=00702100
ECX=d1d55f10 DS=016f ESI=007021a6 FS=6597
EDX=00019e04 ES=016f EDI=00000000 GS=0000
Bytes at CS:EIP:
53 8b 5d 08 48 3b d8 56 7d 0b ff 75 14 ff 75 10 
Stack dump:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 

VB6 在 0167:60567702 的模块
 SSSCC.DLL 中导致无效页错误。
Registers:
EAX=00000000 CS=0167 EIP=60567702 EFLGS=00010246
EBX=60480000 SS=016f ESP=03e2fbe4 EBP=03e2fc14
ECX=00000000 DS=016f ESI=03920540 FS=7817
EDX=817b9278 ES=016f EDI=00000001 GS=65ee
Bytes at CS:EIP:
8b 71 04 85 f6 57 74 23 8b 7c 24 0c 33 d2 8b c7 
Stack dump:
03920540 6056b2c9 00000a84 60480000 00000001 03920540 6056b12b 03920540 03920540 03e2fc24 6058d804 00000000 03e2fc30 6057bcd9 03920540 03920540

解决方案 »

  1.   

    {case WM_SETFOCUS:
    return 0;//不处理就得了。别调用基类的哈。
    break;
    }
      

  2.   

    up     up                   up up
      up     up                   up   up
      up     up                   up  up 
      up     up                   upup
      up up up upup               up
                                  up
    把当前控件能获得焦点的消息屏蔽掉,是否可以用钩子函数?
      

  3.   

    因为原先那边已失去焦点,还得设置有焦点的控件或窗体,上边办法试了,可实现不了我的键盘控件的功能!我试了多种办法,只有上边那样,在WM——SETFOCUS中加入把父窗体设为有焦点才能实现键盘控件的功能!
      

  4.   

    错误应该在::AfxGetMainWnd()->SetFocus();
    VB下调用AfxGetMainWnd应该出错或返回错误的结果。你可以试试GetParent()->SetFocus();
      

  5.   

    上面写错了,应该是SetFocus( GetParent(hwnd) );
      

  6.   

    switch (message)
    {
     case WM_SETFOCUS:
    {
    PostMessage(WM_KILLFOCUS,0,0);
    ::AfxGetMainWnd()->SetFocus();
    break;
                      }
    }
      

  7.   

    我想是在SetFocus()事件中不能再处理SetFocus()事件,否则就将造成死循环,最终导致堆栈溢出
      

  8.   

    SHAN——GHOST的话也许有道理,可2000下没问题!
      

  9.   

    一个建议:你的代码是在得到焦点时通过发送消息让它再失去焦点,但是“如果你在控件得到消息时马上设置这个控件的下一个或者前一个控件得到焦点,这样控件本身不也同样失去焦点吗???”试试下面这行代码:    PostMessage(hwnd,WM_NEXTDLGCTL,0,(WPARAM)false);
      

  10.   

    我很烦,也许以后不能再上这个站了,大家还都是挺热情,可鸟飞机的斑竹不出来,也没人解,而且我总感觉现在的CSDN的商业味太重了,没有纯技术的味了,失落!
      

  11.   

    去掉 SendMessage 一句看看
      

  12.   


    switch (message)
    {case WM_SETFOCUS:
    {
                               hParentWnd= GetParent(this);
    SendMessage(hParentWnd, WM_KILLFOCUS, 0, 0);                   }
    }
      

  13.   

    上面写错了
    是这个
    switch (message)
    {case WM_SETFOCUS:
    {
                               hParentWnd= GetParent(this);
    SendMessage(hParentWnd, WM_NEXTDLGCTL, 0, 0);                   }
    }
      

  14.   

    没效果,输入不进去,把SENDMESSAGE改成SETFOCUS后,运行时还是出错!
      

  15.   

    什么叫输入不进去?
    前面我写的hParentWnd= GetParent(this);这句只是个大概,具体是不是这么个调用方法要根据你的程序,总之不要用AfxGetMainWnd()
      

  16.   

    总之我的控件中只有一个图片,而现在我发现要实现我的功能,必须在setfocus消息中把包含控件的窗体给SETFOCUS才能实现我功能!
      

  17.   

    1.绝不能在setfocus事件中处理setfocus事件,可以设立一个标志并post一个用户自定义事件,然后再在这个事件中转移焦点
    或者
    2.使用postmessage代替sendmessage和::AfxGetMainWnd()->SetFocus()处理所有操作,因postmessage只是把消息投递之后即刻返回而sendmessage的行为则好像调用一个函数----这样若程序处理你post的消息是setfocus事件处理结束之后(大概如此)就能避免出错。但显然不如第一个方法安全。
      

  18.   

    能说详细点儿吗? 你程序里hwnd是哪个Window?AfxGetMainWnd呢?
      

  19.   

    处理SetFocus消息时,不可以再发出(Send)一个SetFocus消息,由于Send是阻塞的,所以
    往往会造成无限循环,引起堆栈溢出.
    可以定义一个你自己的消息,My_SetFocus,然后PostMessage出去,在mY_SETFOCUS里面处理.