整个CSDN有上万分在问这个问题了
竟然没有一个人能站出来回答
我也多次提出过这个问题
http://yeqiufeng.51.net/desktop.jpg 这个替换开始菜单的效果竟然没人能做出来
别人做不出来我们表BCB' Fan也不可以做么
这简直是一种侮辱
只可惜我学识太浅 百思不得其解 到底如何去做
注意:
1、不要告诉我修改注册表 除非你想把我恶心死
2、不要告诉我截获鼠标点击 开始菜单你仔细研究一下 它所响应的远远不止鼠标点击
是虾还是鸟 出来溜溜吧 大侠 请不要再沉默了
沉默啊 沉默啊 再沉默BCB颜面何存
请把这个问题转告给更多的朋友 让我们一起来攻克吧
36 个解决方案
#1
用BCB开始菜单能够替换,用钩子拦截鼠标和键盘(无法拦截WINDOWS键,如用系统钩子则所有系统按键则全被屏蔽)方法(sw0324的一个帖子有非常精彩的原码)。
把弹出菜单放在Canvas上就可在左方加上图片。
把弹出菜单放在Canvas上就可在左方加上图片。
#2
查了一下那篇文章是:WH_JOURNALRECORD钩子和WH_GETMESSAGE钩子不能截断消息吗?(sw0324)
#3
我说了 你们最好仔细研究一下开始菜单
开始菜单的弹出不仅仅在左下角
开始按钮能随任务栏移动 能融与任务栏融为一体最好
开始菜单的弹出不仅仅在左下角
开始按钮能随任务栏移动 能融与任务栏融为一体最好
#4
to yeqiufeng(叶秋枫) :
又不是让你在右下角加一个按钮,你只须把开始菜单的消息屏蔽,在单击时调用弹出菜单就可以了
可以达到向你说的那样。
又不是让你在右下角加一个按钮,你只须把开始菜单的消息屏蔽,在单击时调用弹出菜单就可以了
可以达到向你说的那样。
#5
说具体一点吗!!我也很想知道!!!
最好有源代码!!我也可以另开一个给分!!!!!
最好有源代码!!我也可以另开一个给分!!!!!
#6
解决问题的关键在于什么钩子能够拦截鼠标和键盘消息以外的系统消息,我的问题至今无人回答。
#7
谁有源码?能给我一份吗?在此先谢了
sephil@163.com
sephil@163.com
#8
to luhongjun(过江项羽)
我的意思是开始菜单不仅仅在左下角弹出
你没领会我的意思
当开始按钮随任务栏走的时候
开始菜单也会随之移动
你弹出的菜单有这个效果么
大侠 请给个例子 哪怕是一个关键字
不要纸上谈兵好不好
那样会伤了我和 xycleo sw0324 sephil 的感情的
也会伤了众BCB's fans的感情
还有没有高手 请你站出来吧
大家期待着您
我的意思是开始菜单不仅仅在左下角弹出
你没领会我的意思
当开始按钮随任务栏走的时候
开始菜单也会随之移动
你弹出的菜单有这个效果么
大侠 请给个例子 哪怕是一个关键字
不要纸上谈兵好不好
那样会伤了我和 xycleo sw0324 sephil 的感情的
也会伤了众BCB's fans的感情
还有没有高手 请你站出来吧
大家期待着您
#9
大家站出来,说一句吧!我也正在做,但是没能成功!
#10
恩。我用钩子试了一试。可以修改。但具体的什么弹出菜单就没有做。
实现的道理为用钩子注入“开始”的消息处理过程。
并且修改他的消息处理函数。
/*#pragma data_seg("Shared")
long g_lUsageCount = -1;
#pragma data_seg()
#pragma comment(exestr, "/SECTION:Shared,RWS")
*/
#include "CallDll.h"
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK hook=NULL;
HWND handle=NULL,hBegin=NULL;
WNDPROC oldproc=NULL;
HINSTANCE DllHinst;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ switch(reason)
{ case DLL_PROCESS_ATTACH:
DllHinst=hinst;
break;// CreateMutex
case DLL_PROCESS_DETACH:
// mvar--;
break;
}
return 1;
}
extern "C" __declspec(dllexport)
void SetHook();
extern "C" __declspec(dllexport)
void CloseHook();
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,
WPARAM wParam,
LPARAM lParam)
{ static bool flag=true;
if (flag)
{
flag=false;
handle=FindWindow("Shell_TrayWnd",NULL);
hBegin=GetWindow(handle,GW_CHILD);
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
SetWindowLong(hBegin,GWL_WNDPROC,(LONG)MyApp);
}
return(CallNextHookEx(hook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
void SetHook()
{
DWORD ThrID=NULL;
DWORD ProID=NULL;
handle=FindWindow("Shell_TrayWnd",NULL);
hBegin=GetWindow(handle,GW_CHILD);
ThrID=GetWindowThreadProcessId(hBegin,&ProID);
if (hook==NULL)
hook=SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)MouseHook,
DllHinst,
ThrID);
PostThreadMessage(ThrID,WM_NULL,0,0);
}
//---------------------------------------------------------------------------
void CloseHook()
{ // hBegin=FindWindow("Button",NULL);
// SetWindowLong(hBegin,GWL_WNDPROC,(LONG)oldproc);
if (hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook=NULL;
}
}
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//WndProc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
switch(message)
{
case WM_LBUTTONDOWN:
ShowMessage("haha");
break;
case WM_RBUTTONDOWN:
ShowMessage("heihei");
break;
}
return 1;
// return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);//3处
}
运行后点击,出现“HEHE”,“HAHA”,
已经改掉。而且因为3处没有调用以前的消息处理函数。所以就完全屏蔽掉了。WIN键也失灵了。
但在卸钩子时会发生异常。我还不清楚。
实现的道理为用钩子注入“开始”的消息处理过程。
并且修改他的消息处理函数。
/*#pragma data_seg("Shared")
long g_lUsageCount = -1;
#pragma data_seg()
#pragma comment(exestr, "/SECTION:Shared,RWS")
*/
#include "CallDll.h"
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK hook=NULL;
HWND handle=NULL,hBegin=NULL;
WNDPROC oldproc=NULL;
HINSTANCE DllHinst;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ switch(reason)
{ case DLL_PROCESS_ATTACH:
DllHinst=hinst;
break;// CreateMutex
case DLL_PROCESS_DETACH:
// mvar--;
break;
}
return 1;
}
extern "C" __declspec(dllexport)
void SetHook();
extern "C" __declspec(dllexport)
void CloseHook();
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,
WPARAM wParam,
LPARAM lParam)
{ static bool flag=true;
if (flag)
{
flag=false;
handle=FindWindow("Shell_TrayWnd",NULL);
hBegin=GetWindow(handle,GW_CHILD);
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
SetWindowLong(hBegin,GWL_WNDPROC,(LONG)MyApp);
}
return(CallNextHookEx(hook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
void SetHook()
{
DWORD ThrID=NULL;
DWORD ProID=NULL;
handle=FindWindow("Shell_TrayWnd",NULL);
hBegin=GetWindow(handle,GW_CHILD);
ThrID=GetWindowThreadProcessId(hBegin,&ProID);
if (hook==NULL)
hook=SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)MouseHook,
DllHinst,
ThrID);
PostThreadMessage(ThrID,WM_NULL,0,0);
}
//---------------------------------------------------------------------------
void CloseHook()
{ // hBegin=FindWindow("Button",NULL);
// SetWindowLong(hBegin,GWL_WNDPROC,(LONG)oldproc);
if (hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook=NULL;
}
}
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//WndProc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
switch(message)
{
case WM_LBUTTONDOWN:
ShowMessage("haha");
break;
case WM_RBUTTONDOWN:
ShowMessage("heihei");
break;
}
return 1;
// return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);//3处
}
运行后点击,出现“HEHE”,“HAHA”,
已经改掉。而且因为3处没有调用以前的消息处理函数。所以就完全屏蔽掉了。WIN键也失灵了。
但在卸钩子时会发生异常。我还不清楚。
#11
另外TO sw0324(sw0324)兄:你的问题我把上面的代码稍微改了改就可以了。
#include "CallDll.h"
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK hook=NULL;
HWND handle=NULL,hBegin=NULL;
WNDPROC oldproc=NULL;
HINSTANCE DllHinst;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ switch(reason)
{ case DLL_PROCESS_ATTACH:
break;// CreateMutex
case DLL_PROCESS_DETACH:
// mvar--;
break;
}
DllHinst=hinst;
return 1;
}
extern "C" __declspec(dllexport)
void SetHook();
extern "C" __declspec(dllexport)
void CloseHook();
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,
WPARAM wParam,
LPARAM lParam)
{ static bool flag=true;
if (flag)
{
flag=false;
hBegin=FindWindow(NULL,"qwe"); //1处
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
SetWindowLong(hBegin,GWL_WNDPROC,(LONG)MyApp);
}
return(CallNextHookEx(hook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
void SetHook()
{
DWORD ThrID=NULL;
DWORD ProID=NULL;
hBegin=FindWindow(NULL,"qwe"); //2处
ThrID=GetWindowThreadProcessId(hBegin,&ProID);
if (hook==NULL)
hook=SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)MouseHook,
DllHinst,
ThrID);
PostThreadMessage(ThrID,WM_NULL,0,0);
}
//---------------------------------------------------------------------------
void CloseHook()
{
if (hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook=NULL;
}
}
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
return 1;
// return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);//3处。
}
修改QWE窗口的消息处理函数。即相当于重新定义WINMAIN对应的WNDPROC
不进行任何处理。直接返回。因为3处屏蔽。也没有RETRUN DEFAULTPROC。
所以任何消息都屏蔽了。我实际跑下来的结果。QWE窗口不响应任何鼠标。键盘等。
要不你再看看。。。
#include "CallDll.h"
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK hook=NULL;
HWND handle=NULL,hBegin=NULL;
WNDPROC oldproc=NULL;
HINSTANCE DllHinst;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ switch(reason)
{ case DLL_PROCESS_ATTACH:
break;// CreateMutex
case DLL_PROCESS_DETACH:
// mvar--;
break;
}
DllHinst=hinst;
return 1;
}
extern "C" __declspec(dllexport)
void SetHook();
extern "C" __declspec(dllexport)
void CloseHook();
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,
WPARAM wParam,
LPARAM lParam)
{ static bool flag=true;
if (flag)
{
flag=false;
hBegin=FindWindow(NULL,"qwe"); //1处
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
SetWindowLong(hBegin,GWL_WNDPROC,(LONG)MyApp);
}
return(CallNextHookEx(hook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
void SetHook()
{
DWORD ThrID=NULL;
DWORD ProID=NULL;
hBegin=FindWindow(NULL,"qwe"); //2处
ThrID=GetWindowThreadProcessId(hBegin,&ProID);
if (hook==NULL)
hook=SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)MouseHook,
DllHinst,
ThrID);
PostThreadMessage(ThrID,WM_NULL,0,0);
}
//---------------------------------------------------------------------------
void CloseHook()
{
if (hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook=NULL;
}
}
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
return 1;
// return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);//3处。
}
修改QWE窗口的消息处理函数。即相当于重新定义WINMAIN对应的WNDPROC
不进行任何处理。直接返回。因为3处屏蔽。也没有RETRUN DEFAULTPROC。
所以任何消息都屏蔽了。我实际跑下来的结果。QWE窗口不响应任何鼠标。键盘等。
要不你再看看。。。
#12
上述技术就是:打开进程的边界注入DLL。
附上我的地址: superxr@21cn.com
欢迎大家交流讨论。小弟其实不懂。不过是刚好看到了这一部分。
谢谢各位大虾指教。呵呵
附上我的地址: superxr@21cn.com
欢迎大家交流讨论。小弟其实不懂。不过是刚好看到了这一部分。
谢谢各位大虾指教。呵呵
#13
恩。另外我考虑。因为是直接修改消息处理过程。
应该比截获鼠标。键盘等来的更为彻底。
因为相当于重新定义了WNDPROC这个处理过程。
TO sw0324(sw0324)兄:我的解答因为钩子采用WH_GETMESSAGE.应该所有的消息都屏蔽了。
你认为呢。。
应该比截获鼠标。键盘等来的更为彻底。
因为相当于重新定义了WNDPROC这个处理过程。
TO sw0324(sw0324)兄:我的解答因为钩子采用WH_GETMESSAGE.应该所有的消息都屏蔽了。
你认为呢。。
#14
另外我考虑.因为是直接修改消息处理过程.
相当于重新定义了WNDPROC这个东西.
所以应该比截获鼠标.键盘等来的更为彻底.
TO sw0324(sw0324)兄:我的解答因为是用WH_GETMESSAGE.
应该所有的消息都屏蔽了。你认为呢......
相当于重新定义了WNDPROC这个东西.
所以应该比截获鼠标.键盘等来的更为彻底.
TO sw0324(sw0324)兄:我的解答因为是用WH_GETMESSAGE.
应该所有的消息都屏蔽了。你认为呢......
#15
大伙儿试一试
然后把结果贴出来
好吧
然后把结果贴出来
好吧
#16
能不能截获WM_MENUCOMMAND
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_MENUCOMMAND, // message to send
WPARAM wParam, // item index
LPARAM lParam // handle to menu (HMENU)
);
The WM_MENUCOMMAND message gives you a handle to the menu--so you can access the menu data in the MENUINFO structure—and also gives you the index of the selected item, which is typically what applications need. In contrast, the WM_COMMAND message gives you the menu item identifier.
The WM_MENUCOMMAND message is sent only for menus that are defined with the MNS_NOTIFYBYPOS flag set in the dwStyle member of the MENUINFO structure
来获得对菜单的控制。
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_MENUCOMMAND, // message to send
WPARAM wParam, // item index
LPARAM lParam // handle to menu (HMENU)
);
The WM_MENUCOMMAND message gives you a handle to the menu--so you can access the menu data in the MENUINFO structure—and also gives you the index of the selected item, which is typically what applications need. In contrast, the WM_COMMAND message gives you the menu item identifier.
The WM_MENUCOMMAND message is sent only for menus that are defined with the MNS_NOTIFYBYPOS flag set in the dwStyle member of the MENUINFO structure
来获得对菜单的控制。
#17
to xrbeck(xiaozi):
我试了试,卸载钩子后,再激活被钩住窗口就出错。我估计是恢复默认复窗口程序时不成功。
等我再试试.
秋枫兄你试了吗?结果如何?
我试了试,卸载钩子后,再激活被钩住窗口就出错。我估计是恢复默认复窗口程序时不成功。
等我再试试.
秋枫兄你试了吗?结果如何?
#18
to xrbeck(xiaozi):
我试了试,卸载钩子后,再激活被钩住窗口就出错。我估计是恢复默认复窗口程序时不成功。
等我再试试.
秋枫兄你试了吗?结果如何?
我试了试,卸载钩子后,再激活被钩住窗口就出错。我估计是恢复默认复窗口程序时不成功。
等我再试试.
秋枫兄你试了吗?结果如何?
#19
不会没有人知道桌面是最初始的窗口吧。如果它是一个窗口,理解其他的问题还有那么难吗?如果自己对系统一点都不了解而总希望工具里面什么都提供,还是不要编程了,这样你会受打击的。BCB只是一个工具,只要它提供了C语言的编译能力操作系统能实现该功能,你写不出来能说工具弱智?!
#20
brucegong(飞行猪)的话很有道理!!!!
#21
有时候不骂是不会进步的
#22
我觉得那可能不是真的开始菜单咯
#23
to 飞行猪
这里的人都知道桌面是GetDesktopWindow()
但没有一个人说出来
只有你在这里喑喑乱吠 竟然还不知耻
请走开 想说话拿个例子来再开金口
否则没人服你
几个跟着扇风点火的兄弟 也请给个例子出来再说话 不要让别人觉着你们没别的本事 只会跟风
to sw0324:
我最近又研究了一下 我发现网吧管理专家的菜单是一个按钮而已 不过他融入了任务栏 能和任务栏一起移动 网吧管理专家的按钮点下去以后就弹了出来 是一个标准的按钮 而不是开始菜单那样的点下去直到菜单消失才弹出来
我用自己的程序恢复开始按钮后 我发现网吧管理专家也随之放学了
近日又发现VS.NET的菜单又别具一格……真是任重而道远……
这里的人都知道桌面是GetDesktopWindow()
但没有一个人说出来
只有你在这里喑喑乱吠 竟然还不知耻
请走开 想说话拿个例子来再开金口
否则没人服你
几个跟着扇风点火的兄弟 也请给个例子出来再说话 不要让别人觉着你们没别的本事 只会跟风
to sw0324:
我最近又研究了一下 我发现网吧管理专家的菜单是一个按钮而已 不过他融入了任务栏 能和任务栏一起移动 网吧管理专家的按钮点下去以后就弹了出来 是一个标准的按钮 而不是开始菜单那样的点下去直到菜单消失才弹出来
我用自己的程序恢复开始按钮后 我发现网吧管理专家也随之放学了
近日又发现VS.NET的菜单又别具一格……真是任重而道远……
#24
http://www.ccw.com.cn/htm/app/aprog/01_3_1_5.asp
利用C++ Builder在Windows“开始”按钮上绘图
不知有否帮助?
利用C++ Builder在Windows“开始”按钮上绘图
不知有否帮助?
#25
多谢jlover
#26
to xrbeck(xiaozi):
我还没研究出来,谢谢你的关注,分先给你,请到http://www.csdn.net/expert/topic/82/82220.shtm
接分.
我还没研究出来,谢谢你的关注,分先给你,请到http://www.csdn.net/expert/topic/82/82220.shtm
接分.
#27
我想加分了
但不知道以上结果大家是否满意
但不知道以上结果大家是否满意
#28
呵呵,我看到这里有例子
http://www.programsalon.com/download.asp?type_id=23
就是下载不下来,那位能搞到,发给我一份,上传后给个连接也行,TNND我搞了三四天也没搞出名堂来,真没面子。
http://www.programsalon.com/download.asp?type_id=23
就是下载不下来,那位能搞到,发给我一份,上传后给个连接也行,TNND我搞了三四天也没搞出名堂来,真没面子。
#29
任务栏其实也是个窗口,找到它的句柄(用FindWindow),然后把它的窗口函数替换成你的函数,不知行不行。
#30
to:yelid
你说的是子类化技术
我试过
但我无法替换
可能是我缺乏经验吧
大家同意子类化技术么
就是用SetWindowLong把那个处理鼠标点击的函数替换成自己的
这样就初步达到目的了
你说的是子类化技术
我试过
但我无法替换
可能是我缺乏经验吧
大家同意子类化技术么
就是用SetWindowLong把那个处理鼠标点击的函数替换成自己的
这样就初步达到目的了
#31
有没有人做出来
现在咱们BCB版欠帐的不少
我不能拖着让新问题浮不上来啊
现在咱们BCB版欠帐的不少
我不能拖着让新问题浮不上来啊
#32
结账喽
#33
http://www.programsalon.com/download.asp?type_id=23
现在可以下载了
现在可以下载了
#34
用子类化技术到底如何
#35
拉不出屎来怨茅子,盛不上饭怨勺子!
#36
呵呵
#1
用BCB开始菜单能够替换,用钩子拦截鼠标和键盘(无法拦截WINDOWS键,如用系统钩子则所有系统按键则全被屏蔽)方法(sw0324的一个帖子有非常精彩的原码)。
把弹出菜单放在Canvas上就可在左方加上图片。
把弹出菜单放在Canvas上就可在左方加上图片。
#2
查了一下那篇文章是:WH_JOURNALRECORD钩子和WH_GETMESSAGE钩子不能截断消息吗?(sw0324)
#3
我说了 你们最好仔细研究一下开始菜单
开始菜单的弹出不仅仅在左下角
开始按钮能随任务栏移动 能融与任务栏融为一体最好
开始菜单的弹出不仅仅在左下角
开始按钮能随任务栏移动 能融与任务栏融为一体最好
#4
to yeqiufeng(叶秋枫) :
又不是让你在右下角加一个按钮,你只须把开始菜单的消息屏蔽,在单击时调用弹出菜单就可以了
可以达到向你说的那样。
又不是让你在右下角加一个按钮,你只须把开始菜单的消息屏蔽,在单击时调用弹出菜单就可以了
可以达到向你说的那样。
#5
说具体一点吗!!我也很想知道!!!
最好有源代码!!我也可以另开一个给分!!!!!
最好有源代码!!我也可以另开一个给分!!!!!
#6
解决问题的关键在于什么钩子能够拦截鼠标和键盘消息以外的系统消息,我的问题至今无人回答。
#7
谁有源码?能给我一份吗?在此先谢了
sephil@163.com
sephil@163.com
#8
to luhongjun(过江项羽)
我的意思是开始菜单不仅仅在左下角弹出
你没领会我的意思
当开始按钮随任务栏走的时候
开始菜单也会随之移动
你弹出的菜单有这个效果么
大侠 请给个例子 哪怕是一个关键字
不要纸上谈兵好不好
那样会伤了我和 xycleo sw0324 sephil 的感情的
也会伤了众BCB's fans的感情
还有没有高手 请你站出来吧
大家期待着您
我的意思是开始菜单不仅仅在左下角弹出
你没领会我的意思
当开始按钮随任务栏走的时候
开始菜单也会随之移动
你弹出的菜单有这个效果么
大侠 请给个例子 哪怕是一个关键字
不要纸上谈兵好不好
那样会伤了我和 xycleo sw0324 sephil 的感情的
也会伤了众BCB's fans的感情
还有没有高手 请你站出来吧
大家期待着您
#9
大家站出来,说一句吧!我也正在做,但是没能成功!
#10
恩。我用钩子试了一试。可以修改。但具体的什么弹出菜单就没有做。
实现的道理为用钩子注入“开始”的消息处理过程。
并且修改他的消息处理函数。
/*#pragma data_seg("Shared")
long g_lUsageCount = -1;
#pragma data_seg()
#pragma comment(exestr, "/SECTION:Shared,RWS")
*/
#include "CallDll.h"
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK hook=NULL;
HWND handle=NULL,hBegin=NULL;
WNDPROC oldproc=NULL;
HINSTANCE DllHinst;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ switch(reason)
{ case DLL_PROCESS_ATTACH:
DllHinst=hinst;
break;// CreateMutex
case DLL_PROCESS_DETACH:
// mvar--;
break;
}
return 1;
}
extern "C" __declspec(dllexport)
void SetHook();
extern "C" __declspec(dllexport)
void CloseHook();
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,
WPARAM wParam,
LPARAM lParam)
{ static bool flag=true;
if (flag)
{
flag=false;
handle=FindWindow("Shell_TrayWnd",NULL);
hBegin=GetWindow(handle,GW_CHILD);
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
SetWindowLong(hBegin,GWL_WNDPROC,(LONG)MyApp);
}
return(CallNextHookEx(hook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
void SetHook()
{
DWORD ThrID=NULL;
DWORD ProID=NULL;
handle=FindWindow("Shell_TrayWnd",NULL);
hBegin=GetWindow(handle,GW_CHILD);
ThrID=GetWindowThreadProcessId(hBegin,&ProID);
if (hook==NULL)
hook=SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)MouseHook,
DllHinst,
ThrID);
PostThreadMessage(ThrID,WM_NULL,0,0);
}
//---------------------------------------------------------------------------
void CloseHook()
{ // hBegin=FindWindow("Button",NULL);
// SetWindowLong(hBegin,GWL_WNDPROC,(LONG)oldproc);
if (hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook=NULL;
}
}
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//WndProc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
switch(message)
{
case WM_LBUTTONDOWN:
ShowMessage("haha");
break;
case WM_RBUTTONDOWN:
ShowMessage("heihei");
break;
}
return 1;
// return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);//3处
}
运行后点击,出现“HEHE”,“HAHA”,
已经改掉。而且因为3处没有调用以前的消息处理函数。所以就完全屏蔽掉了。WIN键也失灵了。
但在卸钩子时会发生异常。我还不清楚。
实现的道理为用钩子注入“开始”的消息处理过程。
并且修改他的消息处理函数。
/*#pragma data_seg("Shared")
long g_lUsageCount = -1;
#pragma data_seg()
#pragma comment(exestr, "/SECTION:Shared,RWS")
*/
#include "CallDll.h"
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK hook=NULL;
HWND handle=NULL,hBegin=NULL;
WNDPROC oldproc=NULL;
HINSTANCE DllHinst;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ switch(reason)
{ case DLL_PROCESS_ATTACH:
DllHinst=hinst;
break;// CreateMutex
case DLL_PROCESS_DETACH:
// mvar--;
break;
}
return 1;
}
extern "C" __declspec(dllexport)
void SetHook();
extern "C" __declspec(dllexport)
void CloseHook();
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,
WPARAM wParam,
LPARAM lParam)
{ static bool flag=true;
if (flag)
{
flag=false;
handle=FindWindow("Shell_TrayWnd",NULL);
hBegin=GetWindow(handle,GW_CHILD);
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
SetWindowLong(hBegin,GWL_WNDPROC,(LONG)MyApp);
}
return(CallNextHookEx(hook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
void SetHook()
{
DWORD ThrID=NULL;
DWORD ProID=NULL;
handle=FindWindow("Shell_TrayWnd",NULL);
hBegin=GetWindow(handle,GW_CHILD);
ThrID=GetWindowThreadProcessId(hBegin,&ProID);
if (hook==NULL)
hook=SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)MouseHook,
DllHinst,
ThrID);
PostThreadMessage(ThrID,WM_NULL,0,0);
}
//---------------------------------------------------------------------------
void CloseHook()
{ // hBegin=FindWindow("Button",NULL);
// SetWindowLong(hBegin,GWL_WNDPROC,(LONG)oldproc);
if (hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook=NULL;
}
}
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
//WndProc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
switch(message)
{
case WM_LBUTTONDOWN:
ShowMessage("haha");
break;
case WM_RBUTTONDOWN:
ShowMessage("heihei");
break;
}
return 1;
// return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);//3处
}
运行后点击,出现“HEHE”,“HAHA”,
已经改掉。而且因为3处没有调用以前的消息处理函数。所以就完全屏蔽掉了。WIN键也失灵了。
但在卸钩子时会发生异常。我还不清楚。
#11
另外TO sw0324(sw0324)兄:你的问题我把上面的代码稍微改了改就可以了。
#include "CallDll.h"
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK hook=NULL;
HWND handle=NULL,hBegin=NULL;
WNDPROC oldproc=NULL;
HINSTANCE DllHinst;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ switch(reason)
{ case DLL_PROCESS_ATTACH:
break;// CreateMutex
case DLL_PROCESS_DETACH:
// mvar--;
break;
}
DllHinst=hinst;
return 1;
}
extern "C" __declspec(dllexport)
void SetHook();
extern "C" __declspec(dllexport)
void CloseHook();
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,
WPARAM wParam,
LPARAM lParam)
{ static bool flag=true;
if (flag)
{
flag=false;
hBegin=FindWindow(NULL,"qwe"); //1处
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
SetWindowLong(hBegin,GWL_WNDPROC,(LONG)MyApp);
}
return(CallNextHookEx(hook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
void SetHook()
{
DWORD ThrID=NULL;
DWORD ProID=NULL;
hBegin=FindWindow(NULL,"qwe"); //2处
ThrID=GetWindowThreadProcessId(hBegin,&ProID);
if (hook==NULL)
hook=SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)MouseHook,
DllHinst,
ThrID);
PostThreadMessage(ThrID,WM_NULL,0,0);
}
//---------------------------------------------------------------------------
void CloseHook()
{
if (hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook=NULL;
}
}
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
return 1;
// return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);//3处。
}
修改QWE窗口的消息处理函数。即相当于重新定义WINMAIN对应的WNDPROC
不进行任何处理。直接返回。因为3处屏蔽。也没有RETRUN DEFAULTPROC。
所以任何消息都屏蔽了。我实际跑下来的结果。QWE窗口不响应任何鼠标。键盘等。
要不你再看看。。。
#include "CallDll.h"
#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
HHOOK hook=NULL;
HWND handle=NULL,hBegin=NULL;
WNDPROC oldproc=NULL;
HINSTANCE DllHinst;
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam);
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{ switch(reason)
{ case DLL_PROCESS_ATTACH:
break;// CreateMutex
case DLL_PROCESS_DETACH:
// mvar--;
break;
}
DllHinst=hinst;
return 1;
}
extern "C" __declspec(dllexport)
void SetHook();
extern "C" __declspec(dllexport)
void CloseHook();
//---------------------------------------------------------------------------
LRESULT CALLBACK MouseHook(int nCode,
WPARAM wParam,
LPARAM lParam)
{ static bool flag=true;
if (flag)
{
flag=false;
hBegin=FindWindow(NULL,"qwe"); //1处
oldproc=(WNDPROC)GetWindowLong(hBegin,GWL_WNDPROC);
SetWindowLong(hBegin,GWL_WNDPROC,(LONG)MyApp);
}
return(CallNextHookEx(hook,nCode,wParam,lParam));
}
//---------------------------------------------------------------------------
void SetHook()
{
DWORD ThrID=NULL;
DWORD ProID=NULL;
hBegin=FindWindow(NULL,"qwe"); //2处
ThrID=GetWindowThreadProcessId(hBegin,&ProID);
if (hook==NULL)
hook=SetWindowsHookEx(WH_GETMESSAGE,
(HOOKPROC)MouseHook,
DllHinst,
ThrID);
PostThreadMessage(ThrID,WM_NULL,0,0);
}
//---------------------------------------------------------------------------
void CloseHook()
{
if (hook!=NULL)
{
UnhookWindowsHookEx(hook);
hook=NULL;
}
}
LRESULT CALLBACK MyApp(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
return 1;
// return CallWindowProc((FARPROC)oldproc,hwnd,message,wParam,lParam);//3处。
}
修改QWE窗口的消息处理函数。即相当于重新定义WINMAIN对应的WNDPROC
不进行任何处理。直接返回。因为3处屏蔽。也没有RETRUN DEFAULTPROC。
所以任何消息都屏蔽了。我实际跑下来的结果。QWE窗口不响应任何鼠标。键盘等。
要不你再看看。。。
#12
上述技术就是:打开进程的边界注入DLL。
附上我的地址: superxr@21cn.com
欢迎大家交流讨论。小弟其实不懂。不过是刚好看到了这一部分。
谢谢各位大虾指教。呵呵
附上我的地址: superxr@21cn.com
欢迎大家交流讨论。小弟其实不懂。不过是刚好看到了这一部分。
谢谢各位大虾指教。呵呵
#13
恩。另外我考虑。因为是直接修改消息处理过程。
应该比截获鼠标。键盘等来的更为彻底。
因为相当于重新定义了WNDPROC这个处理过程。
TO sw0324(sw0324)兄:我的解答因为钩子采用WH_GETMESSAGE.应该所有的消息都屏蔽了。
你认为呢。。
应该比截获鼠标。键盘等来的更为彻底。
因为相当于重新定义了WNDPROC这个处理过程。
TO sw0324(sw0324)兄:我的解答因为钩子采用WH_GETMESSAGE.应该所有的消息都屏蔽了。
你认为呢。。
#14
另外我考虑.因为是直接修改消息处理过程.
相当于重新定义了WNDPROC这个东西.
所以应该比截获鼠标.键盘等来的更为彻底.
TO sw0324(sw0324)兄:我的解答因为是用WH_GETMESSAGE.
应该所有的消息都屏蔽了。你认为呢......
相当于重新定义了WNDPROC这个东西.
所以应该比截获鼠标.键盘等来的更为彻底.
TO sw0324(sw0324)兄:我的解答因为是用WH_GETMESSAGE.
应该所有的消息都屏蔽了。你认为呢......
#15
大伙儿试一试
然后把结果贴出来
好吧
然后把结果贴出来
好吧
#16
能不能截获WM_MENUCOMMAND
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_MENUCOMMAND, // message to send
WPARAM wParam, // item index
LPARAM lParam // handle to menu (HMENU)
);
The WM_MENUCOMMAND message gives you a handle to the menu--so you can access the menu data in the MENUINFO structure—and also gives you the index of the selected item, which is typically what applications need. In contrast, the WM_COMMAND message gives you the menu item identifier.
The WM_MENUCOMMAND message is sent only for menus that are defined with the MNS_NOTIFYBYPOS flag set in the dwStyle member of the MENUINFO structure
来获得对菜单的控制。
LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
WM_MENUCOMMAND, // message to send
WPARAM wParam, // item index
LPARAM lParam // handle to menu (HMENU)
);
The WM_MENUCOMMAND message gives you a handle to the menu--so you can access the menu data in the MENUINFO structure—and also gives you the index of the selected item, which is typically what applications need. In contrast, the WM_COMMAND message gives you the menu item identifier.
The WM_MENUCOMMAND message is sent only for menus that are defined with the MNS_NOTIFYBYPOS flag set in the dwStyle member of the MENUINFO structure
来获得对菜单的控制。
#17
to xrbeck(xiaozi):
我试了试,卸载钩子后,再激活被钩住窗口就出错。我估计是恢复默认复窗口程序时不成功。
等我再试试.
秋枫兄你试了吗?结果如何?
我试了试,卸载钩子后,再激活被钩住窗口就出错。我估计是恢复默认复窗口程序时不成功。
等我再试试.
秋枫兄你试了吗?结果如何?
#18
to xrbeck(xiaozi):
我试了试,卸载钩子后,再激活被钩住窗口就出错。我估计是恢复默认复窗口程序时不成功。
等我再试试.
秋枫兄你试了吗?结果如何?
我试了试,卸载钩子后,再激活被钩住窗口就出错。我估计是恢复默认复窗口程序时不成功。
等我再试试.
秋枫兄你试了吗?结果如何?
#19
不会没有人知道桌面是最初始的窗口吧。如果它是一个窗口,理解其他的问题还有那么难吗?如果自己对系统一点都不了解而总希望工具里面什么都提供,还是不要编程了,这样你会受打击的。BCB只是一个工具,只要它提供了C语言的编译能力操作系统能实现该功能,你写不出来能说工具弱智?!
#20
brucegong(飞行猪)的话很有道理!!!!
#21
有时候不骂是不会进步的
#22
我觉得那可能不是真的开始菜单咯
#23
to 飞行猪
这里的人都知道桌面是GetDesktopWindow()
但没有一个人说出来
只有你在这里喑喑乱吠 竟然还不知耻
请走开 想说话拿个例子来再开金口
否则没人服你
几个跟着扇风点火的兄弟 也请给个例子出来再说话 不要让别人觉着你们没别的本事 只会跟风
to sw0324:
我最近又研究了一下 我发现网吧管理专家的菜单是一个按钮而已 不过他融入了任务栏 能和任务栏一起移动 网吧管理专家的按钮点下去以后就弹了出来 是一个标准的按钮 而不是开始菜单那样的点下去直到菜单消失才弹出来
我用自己的程序恢复开始按钮后 我发现网吧管理专家也随之放学了
近日又发现VS.NET的菜单又别具一格……真是任重而道远……
这里的人都知道桌面是GetDesktopWindow()
但没有一个人说出来
只有你在这里喑喑乱吠 竟然还不知耻
请走开 想说话拿个例子来再开金口
否则没人服你
几个跟着扇风点火的兄弟 也请给个例子出来再说话 不要让别人觉着你们没别的本事 只会跟风
to sw0324:
我最近又研究了一下 我发现网吧管理专家的菜单是一个按钮而已 不过他融入了任务栏 能和任务栏一起移动 网吧管理专家的按钮点下去以后就弹了出来 是一个标准的按钮 而不是开始菜单那样的点下去直到菜单消失才弹出来
我用自己的程序恢复开始按钮后 我发现网吧管理专家也随之放学了
近日又发现VS.NET的菜单又别具一格……真是任重而道远……
#24
http://www.ccw.com.cn/htm/app/aprog/01_3_1_5.asp
利用C++ Builder在Windows“开始”按钮上绘图
不知有否帮助?
利用C++ Builder在Windows“开始”按钮上绘图
不知有否帮助?
#25
多谢jlover
#26
to xrbeck(xiaozi):
我还没研究出来,谢谢你的关注,分先给你,请到http://www.csdn.net/expert/topic/82/82220.shtm
接分.
我还没研究出来,谢谢你的关注,分先给你,请到http://www.csdn.net/expert/topic/82/82220.shtm
接分.
#27
我想加分了
但不知道以上结果大家是否满意
但不知道以上结果大家是否满意
#28
呵呵,我看到这里有例子
http://www.programsalon.com/download.asp?type_id=23
就是下载不下来,那位能搞到,发给我一份,上传后给个连接也行,TNND我搞了三四天也没搞出名堂来,真没面子。
http://www.programsalon.com/download.asp?type_id=23
就是下载不下来,那位能搞到,发给我一份,上传后给个连接也行,TNND我搞了三四天也没搞出名堂来,真没面子。
#29
任务栏其实也是个窗口,找到它的句柄(用FindWindow),然后把它的窗口函数替换成你的函数,不知行不行。
#30
to:yelid
你说的是子类化技术
我试过
但我无法替换
可能是我缺乏经验吧
大家同意子类化技术么
就是用SetWindowLong把那个处理鼠标点击的函数替换成自己的
这样就初步达到目的了
你说的是子类化技术
我试过
但我无法替换
可能是我缺乏经验吧
大家同意子类化技术么
就是用SetWindowLong把那个处理鼠标点击的函数替换成自己的
这样就初步达到目的了
#31
有没有人做出来
现在咱们BCB版欠帐的不少
我不能拖着让新问题浮不上来啊
现在咱们BCB版欠帐的不少
我不能拖着让新问题浮不上来啊
#32
结账喽
#33
http://www.programsalon.com/download.asp?type_id=23
现在可以下载了
现在可以下载了
#34
用子类化技术到底如何
#35
拉不出屎来怨茅子,盛不上饭怨勺子!
#36
呵呵