代码内容来自于曾经做过的一个个人电脑安全安全处理助理软件,其中有项功能,就是给正在编辑的窗口内容加密,加密的功能放在右键菜单中调用,呵呵。里面有些用到的结构函数并没有列出来,代码只能大致给出思路
首先需要安装一个窗口过程钩子
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);
}
}