目前位置: VCer资源中心 >>> VCer代码 >>> Windows界面

[本帖已阅读2298次 分值100 回复0次] 张贴资源 发回信箱 控制面板

给Edit编辑窗口的右键菜单加入新的功能

提供者:ISeekYou 张贴时间:2004-05-21 21:24:50.0 出处:vcer.net 作者:不祥

给Edit编辑窗口的右键菜单加入新的功能(2004-05-21 21:24:50.0)


那时


 
级别: VCer排长
头衔: VCer会员

经验: 751
作品: 15
分会: 华中分会
注册: 2004-02-09 19:39:54.0
登录: 2008-05-14 10:14:29.0

代码内容来自于曾经做过的一个个人电脑安全安全处理助理软件,其中有项功能,就是给正在编辑的窗口内容加密,加密的功能放在右键菜单中调用,呵呵。里面有些用到的结构函数并没有列出来,代码只能大致给出思路

首先需要安装一个窗口过程钩子

g_hPROCHook=SetWindowsHookEx(WH_CALLWNDPROC, GetMsgProc, g_hinstDll,  0);

窗口过程主要是在截获到 WM_CONTEXTMENU 消息时,判断当前窗口是否为Edit框, 若是的话,保存原窗口过程,设置新的窗口过程为NormalWndProc。

LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam)

{

 CWPSTRUCT* pStruct = (CWPSTRUCT*)lParam;

 HOOKSHARED *hkShared;

 HHOOK hProcHook;

 HANDLE hMapObject;

 

 hkShared=HooKGetSharedMem(&hMapObject);

 hProcHook=hkShared->g_hPROCHook;

 

 if (nCode == HC_ACTION)

 { 

  if (pStruct->message != WM_CONTEXTMENU )// && pStruct->message != 0x01E2)

  { //只处理右键消息

   HooKReleaseSharedMem(hkShared,hMapObject);

   return CallNextHookEx(hProcHook, nCode, wParam, lParam);

  }

 

  // 是否为Edit类 ----------------------------------------

  TCHAR strClassName[60];

  HWND hWnd;

  ::GetClassName (pStruct->hwnd, strClassName, sizeof(strClassName) / sizeof(strClassName[0]));

  if ( strcmp(strClassName, "Edit") && strcmp(strClassName, "Internet Explorer_Server"))

  {

   HooKReleaseSharedMem(hkShared,hMapObject);

   return CallNextHookEx(hProcHook, nCode, wParam, lParam);

  }

  else

   hWnd = pStruct->hwnd;

  // 是否已经被子类化 ------------------------------------

  if (::GetProp(hWnd, ADPISA_oldProc) != NULL )

  {

   HooKReleaseSharedMem(hkShared,hMapObject);

   return CallNextHookEx(hProcHook, nCode, wParam, lParam);

  

  }

 

  // 取得原来的窗口过程 ----------------------------------

  WNDPROC oldWndProc = (WNDPROC)(long)::GetWindowLong(hWnd, GWL_WNDPROC);

 

  // 保存到窗口的属性中 ----------------------------------

  SetProp(hWnd, ADPISA_oldProc, oldWndProc);

 

  // 子类化 ----------------------------------------------

  if( strcmp(strClassName, "Edit") == 0 )

  {

   if (!SetWindowLong(hWnd, GWL_WNDPROC,(DWORD)(ULONG)NormalWndProc) )

    ::RemoveProp(hWnd, ADPISA_oldProc);

  }

  else if (!SetWindowLong(hWnd, GWL_WNDPROC,(DWORD)(ULONG)IEWndProc) )

   ::RemoveProp(hWnd, ADPISA_oldProc);

 

  PostMessage(hWnd,WM_LOADLIB,0,0);

 }

 HooKReleaseSharedMem(hkShared,hMapObject);

 return CallNextHookEx(hProcHook, nCode, wParam, lParam);

}

 

新的窗口过程如下,主要是在右键菜单中添加新的项,并响应该项的点击事件

LRESULT CALLBACK NormalWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

 WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, ADPISA_oldProc);

 switch(uMsg)

 {

  case WM_CONTEXTMENU:

  {

//该段代码主要是判断 主程序是否已经退出,如果主程序已经退出,则为已经加了新的窗口过程的窗口复原

   HOOKSHARED *hkShared;

   HANDLE hMapObject;

   hkShared=HooKGetSharedMem(&hMapObject);

   HWND hHost = FindWindow(hkShared->lpHostClassName,hkShared->lpHostWindowText);

   HooKReleaseSharedMem(hkShared,hMapObject);

   if(!hHost)

   {

    SetWindowLong(hWnd, GWL_WNDPROC,(DWORD)(ULONG)oldWndProc);

    RemoveProp(hWnd, ADPISA_oldProc);

 //   FreeLibrary( GetModuleHandle( lpModuleFileName) );

    return 0L;

   }

//修改右键菜单

   LPTSTR name = MAKEINTRESOURCE(IDR_MENU1);

   HMENU hmenuChart = ::LoadMenu(g_hinstDll,name);

   HMENU hsubmenu = GetSubMenu(hmenuChart,0);

  

   ModifyMenu(hsubmenu,IDE_ADPISA_ENCRYPT,MF_BYCOMMAND | MF_ENABLED, IDE_ADPISA_ENCRYPT,"加密(&E)");

   ModifyMenu(hsubmenu,IDE_ADPISA_SIGN,MF_BYCOMMAND | MF_ENABLED, IDE_ADPISA_SIGN,"签名(&S)");

   ModifyMenu(hsubmenu,IDE_ADPISA_ENSIGN,MF_BYCOMMAND | MF_ENABLED, IDE_ADPISA_ENSIGN,"加密签名");

   ModifyMenu(hsubmenu,IDE_ADPISA_DECRYPT,MF_BYCOMMAND | MF_ENABLED, IDE_ADPISA_DECRYPT,"解密(&J)");

 

//弹出右键菜单

   TrackPopupMenu(hsubmenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON,

     GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), 0, hWnd, NULL);

   DestroyMenu(hmenuChart);

   return 0L;

  }

 case WM_LOADLIB:

  {

   HMODULE hmod = ::LoadLibraryA(lpModuleFileName);

   if(!hmod)

   {

    SetWindowLong(hWnd, GWL_WNDPROC,(DWORD)(ULONG)oldWndProc);

    RemoveProp(hWnd, ADPISA_oldProc);

   }

   return 0L;

  }

 case WM_COMMAND:

  { //响应消息

   HOOKSHARED *hkShared;

   HANDLE hMapObject;

   hkShared = HooKGetSharedMem(&hMapObject);

   switch( LOWORD(wParam) )

   {

   case IDE_ADPISA_ENCRYPT:

 // 执行上面的加密

    PostMessage(hkShared->g_HostWnd,hkShared->uMsgEncrypt,NULL,NULL);

    break;

   case IDE_ADPISA_SIGN:   // 签名

    PostMessage(hkShared->g_HostWnd,hkShared->uMsgSign,NULL,NULL);

    break;

   case IDE_ADPISA_ENSIGN:  //加密并签名

    PostMessage(hkShared->g_HostWnd,hkShared->uMsgEnSign,NULL,NULL);

    break;

   case IDE_ADPISA_DECRYPT: // 解密

    PostMessage(hkShared->g_HostWnd,hkShared->uMsgDecrypt,NULL,NULL);

    break;

   default:

    HooKReleaseSharedMem(hkShared,hMapObject);

    return CallWindowProc(oldWndProc, hWnd, uMsg, wParam, lParam);

   }

   HooKReleaseSharedMem(hkShared,hMapObject);

   return 0L;

  }

 default:

  return CallWindowProc(oldWndProc, hWnd, uMsg, wParam, lParam);

 }

}

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/2267.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 100% (2 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)