问题是这样的:
现在有一个程序,没有源码。我需要点击该程序中的表格,弹出右键菜单,然后选择一项,这一项下面有子菜单,我要选子菜单的最后一项,然后点击该项,弹出窗体。
我现在已经可以在自己的程序中弹出右键菜单啦,但是怎么选择右键菜单中的一项,再选择该项下的子菜单的最后一项,再点击该项?上面的这几步操作,我该怎么编程实现呢?或朝那个方向找资料呢?
现在有一个程序,没有源码。我需要点击该程序中的表格,弹出右键菜单,然后选择一项,这一项下面有子菜单,我要选子菜单的最后一项,然后点击该项,弹出窗体。
我现在已经可以在自己的程序中弹出右键菜单啦,但是怎么选择右键菜单中的一项,再选择该项下的子菜单的最后一项,再点击该项?上面的这几步操作,我该怎么编程实现呢?或朝那个方向找资料呢?
解决方案 »
- listbox读取memo控件的内容并保存
- 如何模拟delphi弹出式菜单操作
- VB调用delphi的dll出现个问题
- 我是菜鸟,请各位帮帮我,怎么样能在显示窗口完毕后执行一段程序?
- 如何使没有最大化的窗体紧贴任务栏显示?
- 有谁知道文本框可以随意输入的dblookupcombobox吗?
- dbgrid中能否实现象在excel中拖动单元格左下角时复制单元格里的内容.
- 关于string字符计算取值的问题
- 高手请进,关于Raise 语句!
- 有关DirectoryExists、FindFirst等函数在TService失效问题
- 如何保留已选选项
- 有关TIdMessage的问题,请大家帮帮忙,谢了^_^
FindWindow 函数来获得另一个程序窗口Handle然后用ChildWindowFromPoint 取得窗口里控件的Handle再用SendMessage 对其发消息来控制它ChildWindowFromPoint 需要控件在其窗口上的坐标可以用Delphi自有的WinSight32程序查看,因为你的程序控制对象是固定的程序所以这些坐标可以事先取得SendMessage发送的消息号要自已查,,
如: sTemp := 'Hello';
SendMessage(EditHandel,WM_SETTEXT,0,Integer(sTemp));
SendMessage(wButton,BM_CLICK,0,0);在一个Edit中输入Hello并点击了另一个Button
SendMessage(最后一项的句炳,WM_LBUTTONDOWM,0,0);
我的问题其实就是,弹出的菜单,
我发什么消息能够选择弹出菜单的第一项,让他选出子菜单。
然后我再发消息选子菜单的一项,
再发什么消息可以让子菜单的一项点击?实际就是,我该发什么消息?或者我该怎么找这些消息?另外窗体句柄的获取我用的是EnumChildWindows,然后在回调函数中根据控件类名找到该句柄。
现在我不知道弹出菜单是否有句柄呢?菜单中的某一项是否有句柄呢?你们说的edit或者button我都知道的,现在我要操作的是弹出菜单,和选择一项,点击菜单一项。
这些消息我不知道,也没查到!
begin
keybd_event(91, 0, KEYEVENTF_EXTENDEDKEY, 0); //KEYDOWN£?
keybd_event(91, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
sleep(20);
keybd_event(ord('S'), 0, KEYEVENTF_EXTENDEDKEY, 0); //KEYDOWN£?
keybd_event(ord('S'), 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
sleep(20);
keybd_event(ord('c'), 0, KEYEVENTF_EXTENDEDKEY, 0); //KEYDOWN£?
keybd_event(ord('c'), 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
sleep(20);
keybd_event(13, 0, KEYEVENTF_EXTENDEDKEY, 0); //KEYDOWN£?
keybd_event(13, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0);
end;
上面的代码是通过开始菜单打开控制面板的.
其中sleep的时间,在不同的机器上可能不同,可能要做些调整;
EditHandle1 := FindWindowEx(ChildHandle3,0,'Edit',nil);
SendMessage(EditHandle1,WM_SETTEXT,0, IdStr1);//找到下一个Edit
EditHandle2 := GetWindow(EditHandle1,GW_HWNDNEXT);
SendMessage(EditHandle2,WM_SETTEXT,0, IdStr2);
{$EXTERNALSYM GW_HWNDLAST}
GW_HWNDLAST = 1;
{$EXTERNALSYM GW_HWNDNEXT}
GW_HWNDNEXT = 2;
{$EXTERNALSYM GW_HWNDPREV}
GW_HWNDPREV = 3;
{$EXTERNALSYM GW_OWNER}
GW_OWNER = 4;
{$EXTERNALSYM GW_CHILD}
GW_CHILD = 5;
{$EXTERNALSYM GW_MAX}
GW_MAX = 5;
我需要的不是向edit发消息,是向弹出菜单发消息。这个该发什么消息呢?而且我也不要修改文本,我要选择菜单一项,和该项的子项,再点击该子项。这个又该发什么消息呢?
你后面发的是什么东西?是菜单相关的消息吗?
你这是遍历窗体的句柄东西,我想问一下,弹出菜单是窗体吗?弹出菜单的某一项是窗体吗?
AppHD := FindWindow('NoteXPadClass', 'NoteXPad - [需求分析.txt]');
MenuHD := GetMenu(AppHD);
SubMenuHD := GetSubMenu(MenuHD, 0);
MenuItem := GetMenuItemID(SubMenuHD, 2);目前的方法好像只有模拟鼠标操作.
当然,一家之说,高手们说声7~,就当没看见好了。//==========================================================
// 快使用DELPHI 7,哼哼哈兮
//==========================================================
MenuHD := GetMenu(AppHD);
SubMenuHD := GetSubMenu(MenuHD, 0);
MenuItem := GetMenuItemID(SubMenuHD, 1);
PostMessage(AppHD, WM_COMMAND, MenuItem, 0);弹出菜单类似,但很多都不是通用的WM_COMMAND消息,要具体分析.
function TMenu.DispatchCommand(ACommand: Word): Boolean;
var
Item: TMenuItem;
begin
Result := False;
Item := FindItem(ACommand, fkCommand);
if Item <> nil then
begin
Item.Click;
Result := True;
end;
end;
navyfish(深蓝色的鱼):你的最后的方式可行,不过弹出菜单我还没有试!
navyfish(深蓝色的鱼):你的方法最贴近我的要求,以后有时间我还是要详细实现的!
g961681(PerryWang),skertone() :感谢两位给我提供另一个办法,虽然不是最好,但是很简单,我现在就是暂时用这种方式处理的!
也感谢其它人的热心参与,我很反对来着有分的处理方式,所以就不给分啦!请理解。