找了好久的方法,网上都是基于mfc的方法,现在找到解决方法了,分享给大家,
就是要重新设置Edit控件的回调函数
//Win32 SDK 下Edit控件屏蔽右键系统菜单方法 第一步: //声明保存旧的Edit控件回调函数地址的变量 LONG_PTR oldProc; //新的Edit控件的回调函数声明 LONG_PTR CALLBACK EditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 第二步: 在对话框初始函数中添加 BOOL MyWinDialog::OnInitDialog(WPARAM wParam, LPARAM lParam) { AfxCWin::OnInitDialog(wParam, lParam); //TODO:初始化代码 //重新设置Edit控件的回调函数 HWND hEditWnd = ::GetDlgItem(m_hWnd, IDC_EDIT2); oldProc = SetWindowLongPtr(hEditWnd, GWLP_WNDPROC, (LONG_PTR)EditProc); //网上用的是GWL_WNDPROC消息,这个在64系统下不能用,所以只好用这了,32和64都能用 } 第三步;在新回调函数中捕捉鼠标右键按下消息 LONG_PTR CALLBACK EditProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_RBUTTONDOWN: { //在这添加自己的右键菜单,不添加直接返回1就能屏蔽掉系统菜单了
HMENU hRoot = LoadMenu(hThisApp, MAKEINTRESOURCE(IDR_MENU1)); HMENU hSub = GetSubMenu(hRoot, 0); POINT pt; GetCursorPos(&pt); TrackPopupMenu(hSub, TPM_LEFTBUTTON | TPM_TOPALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0,pMyDlg->GetHwnd(), NULL); DestroyMenu(hRoot); } return 1; default: break; } //最后要返回旧的回调函数地址
return CallWindowProc((WNDPROC)oldProc, hWnd, uMsg, wParam, lParam); }