// KillMessage.cpp : Defines the entry point for the application.
////在学习SDK编程,此程序作用是使截获的消息作废,具体的是创建了一个对话框,在
//上面画了一个文本框和一个命令按钮,单击命令按钮后,如果在文本框中单击MOUSE右键则不
//再弹出菜单.也就是屏蔽了右键消息。这个程序没有写玩。
#include "stdafx.h"
#include<windows.h>
#include<windef.h>
#include"resource.h"BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
         DialogBox( hInstance, LPCTSTR("Dialog"), NULL, DLGPROC(DialogProc) ); 
return 0;
}BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch( uMsg )
{
case WM_COMMAND:
{
switch( LOWORD(wParam) ) 
{
case ButtonOk:
     return (TRUE); case IDCANCEL:
EndDialog( hwndDlg, TRUE );
return( TRUE ); //判断出了是文本框.
//问题是:怎样判断出在文本框中单击的是右键?MSDN上说用HIWORD(wParam)来判断消息编号,可是我在单步调式时发现不管是单击左键还是单击右键HIWORD(wParam)的值都是256,这是为什么?
             //这个对话框我选择的是Edit Box这个控件,然后画在对话框上的.
是不是不应该选择这个控件。
case IDC_EDIT:
WORD h;
                                              h = HIWORD(wParam);//h的值都是256
break;
}
break;
}
}
return (FALSE);
}

解决方案 »

  1.   

    请看windows程序设计里面有详细解释
      

  2.   

    谢谢你,请问你说的WINDOWS程序设计是一本书吗,要是书的话那里有下载的,谢谢!
      

  3.   

    应该直接判定:
    switch(uMsg)
    {
    case WM_LBUTTONDOWN:
    break;
    case WM_RBUTTONDOWN:
    break;
    }
      

  4.   

    lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
                      (DWORD)(FARPROC)MyEditProc);
    BOOL CALLBACK MyEditProc( HWND hwndEdit, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    switch( uMsg )
    {
    case WM_RBUTTONDOWN:
    ....
            return lpfnOldEditProc(hwndEdit, uMsg, wParam, lParam);
    }
      

  5.   

    《windows程序设计》  switch(message)
      {
        case WM_RBUTTONDOWN: 
        {
               。。
        }    case WM_LBUTTONDOWN: 
        {
              。。
        }    case WM_DESTROY: 
        {
          PostQuitMessage(0);
          return 0;
        }    default: break;  }  return DefWindowProc(hMainwnd,message,wParam,lParam);}
      

  6.   

    一开始我也是直接在回调函数中判断:
    switch(msg)
    {
    case WM_RBUTTONDOWN
    }
    但是它判断的是在主窗口中单击右键,如果在文本框中单击它根本判断不出来.还有关于HIWORD(wParam)的值都是256这个问题,在WINDOWS程序设计说:当我单击文本框时编辑控件给父窗口消息处理程序发送WM_COMMAND消息,对按钮控件来说,wParam和lParam变量的含义是相同的:LOWORD (wParam) 子窗口IDHIWORD (wParam)通知码lParam 子窗口句柄
    通知码如下所示:EN_SETFOCUS 编辑控件已经获得输入焦点
    EN_KILLFOCUS 编辑控件已经失去输入焦点EN_CHANGE 编辑控件的内容将改变EN_UPDATE 编辑控件的内容已经改变EN_ERRSPACE 编辑控件执行已经超出中间EN_MAXTEXT 编辑控件在插入时执行超出空间EN_HSCROLL 编辑控件的水平滚动条已经被按下EN_VSCROLL 编辑控件的垂直滚动条已经被按下
    我在头文件中找到了EN_SETFOCUS的值,它的值就是256 ,不知道这个问题是不是这回。
    有人告诉我:
    如果你要在主窗口里捕捉,一般的方法是直接捕获 WM_LBUTTONUP然后通过传递进来的鼠标 xPos, yPos,判断是否落在编辑框内,是则加入自己的处理代码,不是则调用默认的处理程序如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了。
    但是如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了,这句话我不太懂,那位能帮忙说的详细一些。 
    你说的如果一定要在编辑框回调函数中处理,你就需要子类化了该控件了。我不太懂,可否再详细些?还有文本框也有自已的回调函数吗?谢谢!
      

  7.   

    你需要为Edit控件指定一个窗口过程
    lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
                      (DWORD)(FARPROC)MyEditProc);
    lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
                      (DWORD)(FARPROC)MyEditProc);
    然后
    BOOL CALLBACK MyEditProc( HWND hwndEdit, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    switch( uMsg )
    {
    case WM_RBUTTONDOWN:
    ....
            return lpfnOldEditProc(hwndEdit, uMsg, wParam, lParam);
    }
      

  8.   

    这实际上就是用SDK SubClass控件
      

  9.   

    你需要为Edit控件指定一个窗口过程
    lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
                      (DWORD)(FARPROC)MyEditProc);
    lpfnOldEditProc = SetWindowLong(hWndEdit, GWL_WNDPROC,
                      (DWORD)(FARPROC)MyEditProc);
    然后
    BOOL CALLBACK MyEditProc( HWND hwndEdit, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    switch( uMsg )
    {
    case WM_RBUTTONDOWN:
    ....
            return lpfnOldEditProc(hwndEdit, uMsg, wParam, lParam);
    }/////////////////////////////我想要获得EDIT回车事件~~这个方法怎么不行~~其它按键都可以获得,单独回车截获不到~
      

  10.   

    回车的话,Edit控件要设置ES_WANTRETURN(大概)样式。
      

  11.   

    程序已完成,有一个新问题,请各位帮忙看一下,谢谢!
    问题:当单击按钮后,如果再一次单击则退出程序?这是为什么?
    #include "stdafx.h"
    #include<windows.h>
    #include<windef.h>
    #include<winuser.h>
    #include"resource.h"BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );
    BOOL CALLBACK NewWndproc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam );//文本框原窗口过程地址
    long prevWndProc = 0; 
    //文本框的句柄
    HWND hwndEdit = 0;int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    DialogBox( hInstance, LPCTSTR("Dialog"), NULL, DLGPROC(DialogProc) ); 
    return 0;
    }BOOL CALLBACK DialogProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {

    switch( uMsg )
    {
    case WM_COMMAND:
    {
    switch( LOWORD(wParam) ) 
    {
    case ButtonOk:
    //得到文本框的句柄
    hwndEdit = GetDlgItem( hwndDlg, IDC_EDIT);

    //得到文本框原窗口过程的地址
    prevWndProc = GetWindowLong( hwndEdit, GWL_WNDPROC ); //改变窗口过程
    SetWindowLong( hwndEdit, GWL_WNDPROC, (LONG)NewWndproc );

    return( TRUE );

                                         这里多画了一个按钮,用于恢复文本框的状态
    case ButtonComeBack:
    //恢复窗口过程
    SetWindowLong( hwndEdit, GWL_WNDPROC, prevWndProc );
    return( TRUE ); case IDCANCEL:
    SetWindowLong( hwndEdit, GWL_WNDPROC, prevWndProc );
    EndDialog( hwndDlg, TRUE );
    return( TRUE );
    }
    break;
    }
    }
    return (FALSE);
    }
    BOOL CALLBACK NewWndproc( HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {
    switch ( uMsg )
    {
    case WM_RBUTTONDOWN:
    //产生左键单击的消息,从而屏蔽右键的单击
                               uMsg = WM_LBUTTONDOWN;
    SendMessage( hwndDlg, uMsg, wParam, lParam );
    return (TRUE);

    default:
    CallWindowProc( (WNDPROC)prevWndProc, hwndDlg, uMsg, wParam, lParam ); 
    return ( TRUE );
    }
    return (FALSE);
    }