散分:很奇怪的问题,很多高手都解决不了
很少的代码,
就是用hook机制将dll注入进程插入菜单,
插入有的EXE后菜单全是灰的,
有的却不是灰的,
诡异的很!
踏遍祖国大江南北,
寻访无数英雄豪杰,
都没有找到答案,
不知道在这里能否得到解决,
能够给出有用建议的请再进这贴:
http://community.csdn.net/Expert/topic/5128/5128860.xml?temp=.3527796
分全给你,
下面是主要代码,
其实也就这些代码,
要源码的留下email
void StartHook(HWND hWnd)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
si.cb = sizeof(STARTUPINFO);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwFlags = 0;
si.cbReserved2 = 0;
si.lpReserved2 = NULL;
BOOL bres = CreateProcess(
NULL
//这个是记事本,不灰
,_T("C:\\WINNT\\system32\\notepad.exe")
//这个是写字板,全灰
,_T("C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe")
//很奇怪,不知道在这两个exe上分别插入会有什么区别
,NULL
,NULL
,false
,NORMAL_PRIORITY_CLASS
,NULL
,NULL
,&si
,&pi);
threadId = pi.dwThreadId;
if(bres == false)
{
AfxMessageBox("CreateProcess failed");
}
glhHook=(HWND)SetWindowsHookEx(WH_KEYBOARD, HookProc, AfxGetInstanceHandle(), 0);
}
LRESULT WINAPI HookProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(threadId == GetCurrentThreadId())
{
if(!istheMenuCreated)
{
HWND hwnd = GetActiveWindow();
HMENU theMenu = GetMenu(hwnd);
if(theMenu)
{
int ItemCount = GetMenuItemCount(theMenu);
HMENU pop = CreatePopupMenu();
InsertMenu(pop, 0, MF_BYPOSITION, IDM_ITEM0, "ITEM0");
InsertMenu(pop, 1, MF_BYPOSITION, IDM_ITEM1, "ITEM1");
HMENU pop2 = CreatePopupMenu();
InsertMenu(pop2, 0, MF_BYPOSITION, IDM_ITEM20, "ITEM20");
InsertMenu(pop2, 1, MF_BYPOSITION, IDM_ITEM21, "ITEM21");
InsertMenu(pop, 2, MF_BYPOSITION | MF_STRING|MF_POPUP, (UINT)pop2, "ITEM2");
InsertMenu(theMenu, ItemCount-1, MF_BYPOSITION | MF_STRING | MF_POPUP, (UINT)pop, "PCP");
/*
((CFrameWnd *)AfxGetMainWnd())->m_bAutoMenuEnable = FALSE;
if(!EnableMenuItem(pop, IDM_ITEM0, MF_BYPOSITION | MF_ENABLED))
{
AfxMessageBox("menu enable failed");
}
*/
DrawMenuBar(hwnd);
lpOldWndFunc=(WNDPROC)GetWindowLong(hwnd, GWL_WNDPROC);
SetWindowLong(hwnd,GWL_WNDPROC, (LONG)WinProc);
}
istheMenuCreated=TRUE;
}
}
return CallNextHookEx((HHOOK)glhHook,nCode,wParam,lParam);
}
LRESULT CALLBACK WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDM_ITEM0:
AfxMessageBox("ITEM0");
break;
case IDM_ITEM1:
AfxMessageBox("ITEM1");
break;
case IDM_ITEM20:
AfxMessageBox("ITEM20");
break;
case IDM_ITEM21:
AfxMessageBox("ITEM21");
break;
}
break;
}
return CallWindowProc(lpOldWndFunc, hwnd, uMsg, wParam, lParam);
}
void StopHook()
{
UnhookWindowsHookEx((HHOOK)glhHook);
}