使DISABLE的菜单变为ENABLE?(200分)

  • 主题发起人 主题发起人 theng
  • 开始时间 开始时间
T

theng

Unregistered / Unconfirmed
GUEST, unregistred user!
请问怎样编程做一个监控程序,当右键点某软件的disable的对象(如按钮,菜单项)时,
可使其ENABLE,要完整源码。
 
定义一个热区,覆盖那个控件。就可以判断了
 
好像不大可能。有很多对象没有句柄。。
 
如是你自个的软件好办,如是别人做的难办。
 
那岂不天下大乱?
 
那它不是还能用吗,怎么叫disable
 
如果能这样,那我做菜单权限程序都要改一改了,但愿.......
 
这个很难做。
首先要用鼠标钩了,截获所有鼠标右击消息。
然后要设法寻找被点击的窗口元素的句柄(这个不见得都有)
如果上一步可以解决,那么就好办,向该控件发个消息搞掂。
 
我觉得不可能!!
 
这个功能是可以实现的,但要具体问题具体分析,
没有完全通用的方法.不过仍有一个简单的方法,基本上可以解决大多数的此类问题.
我曾经用这个办法使用过一个共享软件的受限功能.
不过,好像现在做这种类型限制的共享软件不多见了.

如果只要结果不注重方式的话,可以来个简化,
使用另外一个进程来解锁被封锁的进程中窗口元素.

以下例子在使用的时候,只需点着自己进程中的Button,在想要起作用的程序主窗体上
松开左键,所有被disabled的菜单就会重新Eanbled.
至于按钮就更简单了,看了以下的例子,我想你应该自己会写恢复Disabled的按钮.

TO: ;JohnsonGuo
; ; 你说的没有错,<<"寻找被点击的窗口元素的句柄(这个不见得都有)">>
; ; 其实找不到的并不见得就一定没有,部分程序只是比较难扑获窗口元素的句柄.
; ; 例如:被子类化的Edit等.但还是有办法的,所以说没有通用的解决方法.

TO: ;htw
; ; >>"那我做菜单权限程序都要改一改了,但愿....... ; ;"

; ; 唉,有违你的心愿了!希望对你的系统影响不大.

By the way: As far as I can see, all of us should be menfolks!
; ; ; ; ; ; None of ladies would be interested in that question.
; ; ; ; ; ;
; ; ; ; ; ; By Heaven! ; ; ; ; ; ;
; ; ; ; ; ; 2 century before,
; ; ; ; ; ; ; ; ; ;"Women----your name are weakness. "
; ; ; ; ; ; as yet "Peking women----your name are ;vainglory"
; ; ; ; ; ; Heaven Forgive me! I don't want to be so rude.


Procedure Enable_Submenu(MainMenu:hmenu; Index:integer);
{
MainMenu:主菜单,Index:子菜单索引,从0开始.
}
var
; i,Count:integer;
; Current_child:hmenu;
; temp_menu_info:tagMENUITEMINFO;
begin
; Current_child:=getsubmenu(MainMenu,index);
; Count:=GetMenuItemCount(Current_child);
; temp_menu_info.cbSize:=sizeof(temp_menu_info);
; temp_menu_info.fMask:=MIIM_STATE;
; temp_menu_info.dwTypeData:='';
; for i:=0 to count-1 do
; ; begin
; ; ; GetMenuItemInfo(Current_child,i,true,temp_menu_info);
; ; ; temp_menu_info.fState:=MFS_ENABLED;
; ; ; SetMenuItemInfo(Current_child,i,true,temp_menu_info);
; ; end;
end;


procedure TForm1.BitBtn1MouseUp(Sender: TObject; Button: TMouseButton;
; Shift: TShiftState; X, Y: Integer);
var
; p:tpoint;
; h:hwnd;
; MainMenu:Hmenu;
; i,Count:integer;
begin
; p.x:=x;p.y:=y;
; windows.ClientToScreen(bitbtn1.handle,p);
; h:=windowfrompoint(p);
; MainMenu:=getmenu(h);
; Count:=GetMenuItemCount(MainMenu);
; For i:=0 to Count-1 Do
; ; begin
; ; ; Enable_Submenu(MainMenu,i);
; ; end;
end;
 
接受答案了.
 
后退
顶部