这个功能是可以实现的,但要具体问题具体分析,
没有完全通用的方法.不过仍有一个简单的方法,基本上可以解决大多数的此类问题.
我曾经用这个办法使用过一个共享软件的受限功能.
不过,好像现在做这种类型限制的共享软件不多见了.
如果只要结果不注重方式的话,可以来个简化,
使用另外一个进程来解锁被封锁的进程中窗口元素.
以下例子在使用的时候,只需点着自己进程中的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;