别人的程序加入自己的菜单
来源:互联网 发布:腊肠的吃法 知乎 编辑:程序博客网 时间:2024/04/30 12:57
CSDN 经常看到有人问, 我把代码贴出来
已经编译好的程序 http://download.csdn.net/source/267091
#include "StdAfx.h"
#include <tchar.h>
#include "ComFun/ComFun.h"
///////////////////////////////////////////////////////////////////////////////////
//PPSYS.DLL
//Coder: Yofoo
///////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK CallWndProcRetFunc(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK GetMsgProcFunc(int nCode, WPARAM wParam, LPARAM lParam);
#define SC_WNDTOP 0x0C01
#define MF_MYTOPMENU 0xFFFF
//#define DLG_NEEDSTYLE WS_OVERLAPPEDWINDOW
#define DLG_NEEDSTYLE (WS_CAPTION | WS_SYSMENU)
#define MENUTOP_STR _T("Always On Top(&T)")
#pragma data_seg(".SHARE")
_declspec(allocate(".SHARE"))
HHOOK hCallWndRet = NULL;
HHOOK hGetMsg = NULL;
HWND g_hThisWnd = NULL;
#pragma data_seg ()
#pragma comment(linker, "/SECTION:.SHARE,RWS")
//std::map<HWND, BOOL> WindowTop;
extern HINSTANCE hins;
BOOL bMenuInserted = FALSE;
BOOL bWndToped = FALSE;
HMENU hSysMenu = NULL;
UINT uMenuID = -1;
// 10001020
BOOL InstallMenu(HWND hThisWnd = NULL)
{
g_hThisWnd = hThisWnd;
hCallWndRet = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndProcRetFunc, hins, 0);
hGetMsg = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProcFunc, hins, 0);
return TRUE;
}
// 10001070
BOOL RemoveTopMenu()
{
BOOL bRetVal = TRUE;
bRetVal &= UnhookWindowsHookEx(hGetMsg);
bRetVal &= UnhookWindowsHookEx(hCallWndRet);
return bRetVal;
}
// 10001120
BOOL DeleteTopMenu(HWND hWnd)
{
int nMenuItemCount, i, nRetVal;
TCHAR buf[1024];
nMenuItemCount = GetMenuItemCount(hSysMenu);
for(i=nMenuItemCount-1; i>=0; i--)
{
nRetVal = GetMenuString(hSysMenu, i, buf, sizeof(buf), MF_BYPOSITION);
if(nRetVal == 0)
continue;
if(_tcscmp(MENUTOP_STR, buf) == 0)
{
RemoveMenu(hSysMenu, i, MF_BYPOSITION);
i--;
RemoveMenu(hSysMenu, i, MF_BYPOSITION);
DrawMenuBar(hWnd);
bMenuInserted = FALSE;
return TRUE;
}
}
bMenuInserted = FALSE;
return FALSE;
}
// 100010A0
BOOL InsertTopMenu(HWND hWnd, BOOL bToped)
{
UINT uFlags;
if(bMenuInserted)
return FALSE;
hSysMenu = GetSystemMenu(hWnd, FALSE);
uMenuID = GetMenuItemID(hSysMenu, 0);
AppendMenu(hSysMenu, MF_SEPARATOR, NULL, NULL);
if(bToped)
uFlags = MF_CHECKED;
else
uFlags = MF_UNCHECKED;
AppendMenu(hSysMenu, uFlags, SC_WNDTOP, MENUTOP_STR);
DrawMenuBar(hWnd);
bMenuInserted = TRUE;
return TRUE;
}
// 10001290
LRESULT CALLBACK CallWndProcRetFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetVal;
PCWPRETSTRUCT pCwpret;
if(nCode < 0 )
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
pCwpret = (PCWPRETSTRUCT)lParam;
if(pCwpret->hwnd == g_hThisWnd)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
if(pCwpret->message == WM_INITMENU)
{
if(bMenuInserted)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
LONG lStyle;
lStyle = GetWindowLong(pCwpret->hwnd, GWL_STYLE);
if((lStyle & DLG_NEEDSTYLE) == 0 )
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
// HWND hParWnd;
// hParWnd = GetParent(pCwpret->hwnd);
// if( hParWnd != NULL)
// {
// }
InsertTopMenu(pCwpret->hwnd, bWndToped);
}
else if(pCwpret->message == WM_MENUSELECT)
{
HMENU hMenu;
UINT uFlags;
uFlags = pCwpret->wParam >> 16;
hMenu = (HMENU)pCwpret->lParam;
if(uFlags != MF_MYTOPMENU)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
if(hMenu != NULL)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
DeleteTopMenu(pCwpret->hwnd);
}
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
// 100011D0
LRESULT CALLBACK GetMsgProcFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetVal;
PMSG pMsg;
HWND hWndInsertAfter;
if(nCode < 0 || wParam == PM_NOREMOVE)
{
lRetVal = CallNextHookEx(hGetMsg, nCode, wParam, lParam);
return lRetVal;
}
pMsg = (PMSG)lParam;
if(pMsg->hwnd == g_hThisWnd ||
pMsg->message != WM_SYSCOMMAND ||
pMsg->wParam != SC_WNDTOP)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
if(bWndToped)
{
hWndInsertAfter = HWND_NOTOPMOST;
bWndToped = FALSE;
}
else
{
hWndInsertAfter = HWND_TOPMOST;
bWndToped = TRUE;
}
SetWindowPos(pMsg->hwnd, hWndInsertAfter, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE);
DeleteTopMenu(pMsg->hwnd);
InsertTopMenu(pMsg->hwnd, bWndToped);
return 0;
}
#include <tchar.h>
#include "ComFun/ComFun.h"
///////////////////////////////////////////////////////////////////////////////////
//PPSYS.DLL
//Coder: Yofoo
///////////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK CallWndProcRetFunc(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK GetMsgProcFunc(int nCode, WPARAM wParam, LPARAM lParam);
#define SC_WNDTOP 0x0C01
#define MF_MYTOPMENU 0xFFFF
//#define DLG_NEEDSTYLE WS_OVERLAPPEDWINDOW
#define DLG_NEEDSTYLE (WS_CAPTION | WS_SYSMENU)
#define MENUTOP_STR _T("Always On Top(&T)")
#pragma data_seg(".SHARE")
_declspec(allocate(".SHARE"))
HHOOK hCallWndRet = NULL;
HHOOK hGetMsg = NULL;
HWND g_hThisWnd = NULL;
#pragma data_seg ()
#pragma comment(linker, "/SECTION:.SHARE,RWS")
//std::map<HWND, BOOL> WindowTop;
extern HINSTANCE hins;
BOOL bMenuInserted = FALSE;
BOOL bWndToped = FALSE;
HMENU hSysMenu = NULL;
UINT uMenuID = -1;
// 10001020
BOOL InstallMenu(HWND hThisWnd = NULL)
{
g_hThisWnd = hThisWnd;
hCallWndRet = SetWindowsHookEx(WH_CALLWNDPROCRET, CallWndProcRetFunc, hins, 0);
hGetMsg = SetWindowsHookEx(WH_GETMESSAGE, GetMsgProcFunc, hins, 0);
return TRUE;
}
// 10001070
BOOL RemoveTopMenu()
{
BOOL bRetVal = TRUE;
bRetVal &= UnhookWindowsHookEx(hGetMsg);
bRetVal &= UnhookWindowsHookEx(hCallWndRet);
return bRetVal;
}
// 10001120
BOOL DeleteTopMenu(HWND hWnd)
{
int nMenuItemCount, i, nRetVal;
TCHAR buf[1024];
nMenuItemCount = GetMenuItemCount(hSysMenu);
for(i=nMenuItemCount-1; i>=0; i--)
{
nRetVal = GetMenuString(hSysMenu, i, buf, sizeof(buf), MF_BYPOSITION);
if(nRetVal == 0)
continue;
if(_tcscmp(MENUTOP_STR, buf) == 0)
{
RemoveMenu(hSysMenu, i, MF_BYPOSITION);
i--;
RemoveMenu(hSysMenu, i, MF_BYPOSITION);
DrawMenuBar(hWnd);
bMenuInserted = FALSE;
return TRUE;
}
}
bMenuInserted = FALSE;
return FALSE;
}
// 100010A0
BOOL InsertTopMenu(HWND hWnd, BOOL bToped)
{
UINT uFlags;
if(bMenuInserted)
return FALSE;
hSysMenu = GetSystemMenu(hWnd, FALSE);
uMenuID = GetMenuItemID(hSysMenu, 0);
AppendMenu(hSysMenu, MF_SEPARATOR, NULL, NULL);
if(bToped)
uFlags = MF_CHECKED;
else
uFlags = MF_UNCHECKED;
AppendMenu(hSysMenu, uFlags, SC_WNDTOP, MENUTOP_STR);
DrawMenuBar(hWnd);
bMenuInserted = TRUE;
return TRUE;
}
// 10001290
LRESULT CALLBACK CallWndProcRetFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetVal;
PCWPRETSTRUCT pCwpret;
if(nCode < 0 )
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
pCwpret = (PCWPRETSTRUCT)lParam;
if(pCwpret->hwnd == g_hThisWnd)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
if(pCwpret->message == WM_INITMENU)
{
if(bMenuInserted)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
LONG lStyle;
lStyle = GetWindowLong(pCwpret->hwnd, GWL_STYLE);
if((lStyle & DLG_NEEDSTYLE) == 0 )
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
// HWND hParWnd;
// hParWnd = GetParent(pCwpret->hwnd);
// if( hParWnd != NULL)
// {
// }
InsertTopMenu(pCwpret->hwnd, bWndToped);
}
else if(pCwpret->message == WM_MENUSELECT)
{
HMENU hMenu;
UINT uFlags;
uFlags = pCwpret->wParam >> 16;
hMenu = (HMENU)pCwpret->lParam;
if(uFlags != MF_MYTOPMENU)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
if(hMenu != NULL)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
DeleteTopMenu(pCwpret->hwnd);
}
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
// 100011D0
LRESULT CALLBACK GetMsgProcFunc(int nCode, WPARAM wParam, LPARAM lParam)
{
LRESULT lRetVal;
PMSG pMsg;
HWND hWndInsertAfter;
if(nCode < 0 || wParam == PM_NOREMOVE)
{
lRetVal = CallNextHookEx(hGetMsg, nCode, wParam, lParam);
return lRetVal;
}
pMsg = (PMSG)lParam;
if(pMsg->hwnd == g_hThisWnd ||
pMsg->message != WM_SYSCOMMAND ||
pMsg->wParam != SC_WNDTOP)
{
lRetVal = CallNextHookEx(hCallWndRet, nCode, wParam, lParam);
return lRetVal;
}
if(bWndToped)
{
hWndInsertAfter = HWND_NOTOPMOST;
bWndToped = FALSE;
}
else
{
hWndInsertAfter = HWND_TOPMOST;
bWndToped = TRUE;
}
SetWindowPos(pMsg->hwnd, hWndInsertAfter, 0, 0, 0, 0,
SWP_NOSIZE | SWP_NOMOVE);
DeleteTopMenu(pMsg->hwnd);
InsertTopMenu(pMsg->hwnd, bWndToped);
return 0;
}
- 别人的程序加入自己的菜单
- 在windows右键菜单中加入自己的程序
- 怎样在CRichEditCtrl控件中加入自己的右键菜单?
- 学习笔记 - 织梦后台系统加入自己的菜单
- 别人眼中的自己
- AltiumDesigner03——将别人库中的元件加入自己的库中
- 自己一个人研究别人程序时的遭遇
- 在程序的系统菜单中加入自定义项
- [Ubuntu]将QQ加入到你的程序菜单中
- 基于对话框的MFC程序加入菜单资源
- cocos2d入门教程5:为我们的程序加入菜单
- 让别人自己决定别人的生活
- 如何把自己的菜单加入到桌面右键菜单中?
- 如何在自己的程序中加入宏的功能
- 模仿别人的程序
- 将自己写的程序加入到PlatForm中
- 在自己的程序中加入脚本支持(一)
- 在自己的程序中加入脚本支持(二)
- firefox鼠标快捷键
- 关于C++中构造函数的说明
- firefox键盘快捷健
- 随便写写
- 在weblogic8下面配置数据连接池的数量多少为适合,
- 别人的程序加入自己的菜单
- Symbian中TBuf初始化汉字为乱码的解决方法
- 嵌入式开发—C语言面试题(Good)
- java annocation(注解)
- IE屏蔽鼠标右键及快捷键方法
- 在sun fire X4200上安装oracle9204的经验
- 在linux as4 上安装oracle9204完成后的配置工作
- 某软件公司部分面试题c#
- 数据库模式