如何模拟用户选择控件右键弹出菜单的某一项(如Edit控件的右键菜单“剪切”,WebBrower 的“打印”) ****** 为什么没人

  • 主题发起人 主题发起人 SaisSoft
  • 开始时间 开始时间
S

SaisSoft

Unregistered / Unconfirmed
GUEST, unregistred user!
如何模拟用户选择控件右键弹出菜单的某一项(如Edit控件的右键菜单“剪切”,WebBrower 的“打印”) ****** 为什么没人回答:( 分不够我再加 100 分 ******* (35分)<br />我想通过程序模拟用户选择控件的右键菜单中的一项
 
试试看:
1.找到当前browser窗口的handle
2.GetSystemMenu获得browser的主菜单
3.GetSubMenu获得相应子菜单
4.GetMenuItemID获得您感兴趣的menu项
5.发送WM_COMMAND消息(wparam为menuid, lparam为0)
 
不用那嘛麻烦吧,这样行不行呢?

//菜单定义过程
procedure TForm1.EditCutClick(Sender: TObject);
begin
showmessage('asdf');
end;

//模拟过程
procedure TForm1.Button1Click(Sender: TObject);
begin
EditCutClick(Sender);
end;
 
To BDFan:
我不太懂那些函数呀 [:(][:(][:(]
TO jobsxy :
我是指控件的默认菜单,不是自己定义的菜单
 
默认得,就只能用BDFan的方法咯
 
哪位大侠给我 模拟用户选择 TWebBrower 右键菜单中“打印”的源码我给 100 分
 
什么意思?没有看明白。
 
我是想不用用户在 TWebBrower 上点右键,然后选择“打印”,而是设置一个按钮
在按钮中写代码,执行“打印”命令。
不用告诉我用
WebBrower1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, EmptyParam,EmptyParam);
因为执行此语句后,ADOQuery 所有的 查询都出错,“参数类型不正确,或不再可以接受的
范围之内,或与其它参数冲突”(实际上是只要执行 ExecWB ,ADOQuery 就会出错,
ADO 补丁已经安装)

如果哪位大侠能解决此问题,我再加 50 分
 
难道是分数不够吗?[:(][:(][:(]
那我给你我的全部,我还有 250 分,只要哪位大侠解决了这两个问题
1。模拟用户选择控件右键弹出菜单的某一项
2。执行ExecWB后ADOQuery出错
我保证全部奉上[:(]
 
不懂
应该有对应的属性或事件与之相关连吧?
如:Edit1.CutToCli...;
 
》》1。模拟用户选择控件右键弹出菜单的某一项
我感觉用BDFan的思路是没有错的
但是,我也不会做 :(
 
BDFan 的方法我试过了,可以模拟一个窗体的 控制菜单 (如:关闭、最大化、最小化)
但无法模拟 TEdit 或 TWebBrower 的右键菜单中的命令。
hMnu := GetSystemMenu(WebBrower1.Handle,false); //hMnu := 0

使用 hMnu := GetMenu(WebBrower1.Handle); //hMnu &lt;&gt; 0
mnuID := GetMenuItemID(hMnu,18); //mnuID = -1
SendMessage(WebBrower1.Handle,WM_COMMAND,mnuID,0); //没反应(因为mnuID=-1?)
 
我试了试,没有错误,应该试可以打印的吧。
WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
if WebBrowser1.QueryStatusWB(OLECMDID_PRINTPREVIEW) = 3 then
WebBrowser1.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam); //打印预览,IE5.5以上版本


另外添加下面的看看。
  initialization
   OleInitialize(nil);
  finalization
   try
    OleUninitialize;
   except
   end;
 
关于你的另一个问题1。模拟用户选择控件右键弹出菜单的某一项看看下面的方法能不能解决:(或者说
是不是你想要的)
首先放一个PopupMenu在上面,写入菜单项,然后放一个TApplicationEvents组件,在Additional页中
接着在TApplicationEvents组件的OnMessage事件中写入如下代码:

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
mPoint : TPoint;
begin
if IsChild(WebBrowser1.Handle, Msg.Hwnd) and
((Msg.Message = WM_RBUTTONDOWN) or (Msg.Message = WM_RBUTTONUP)) then
begin
GetCursorPos(mPoint);
PopupMenu1.Popup(mPoint.X, mPoint.Y);
Handled:=True;
end;
end;

试试看是不是你要的。
 
飘摇客:
我想执行的是控件默认的菜单的某一项,不是自定义的菜单。

&gt;&gt; 我试了试,没有错误,应该试可以打印的吧。
WebBrowser1.ExecWB(OLECMDID_PRINT, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
if WebBrowser1.QueryStatusWB(OLECMDID_PRINTPREVIEW) = 3 then
WebBrowser1.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam); //打印预览,IE5.5以上版本
打印正常,可是 ADOQuery 出错。

[red]我说说我的原意[/red]:我开始本是用上面的方法打印,可是ADOQuery出错;而选择在TWebBrower控件
上点右键时弹出的菜单中的“打印”正常,而且ADOQuery不出错,所以我才想要模拟用户
选择控件右键菜单中的一项。

下面是我新建的一个项目:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Db, ADODB, OleCtrls, SHDocVw;

type
TForm1 = class(TForm)
WebBrowser1: TWebBrowser;
ADOQuery1: TADOQuery;
ADOConnection1: TADOConnection;
Button1: TButton;
Button2: TButton;
Button3: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
with Adoquery1 do
Begin
Close;
Sql.clear;
sql.Add('Select * from SysSetting ');
Open;
Close;
End;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
WebBrowser1.Navigate('d:/empty.htm');
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
if WebBrowser1.QueryStatusWB(OLECMDID_PRINTPREVIEW) = 3 then
WebBrowser1.ExecWB(OLECMDID_PRINTPREVIEW, OLECMDEXECOPT_DODEFAULT, EmptyParam, EmptyParam);
end;

end.

只要点击button3 之后,再点击button1 ,就会出错:
“参数类型不正确,或不再可以接受的
范围之内,或与其它参数冲突”

感谢 飘摇客 帮助!!!
 
你说的这个WebBrowser的打印和Ado冲突在以前论坛上确实存在类似的帖子。
你可以找一下。
 
yzhshi:
那能解决吗?

“参数类型不正确,或不再可以接受的范围之内,或与其它参数冲突”
该错误在另一个地方也出现,请看:(这是李维的书上的例子)

procedure TForm1.RadioButton1Click(Sender: TObject);
begin
ADOQuery1.Filtered := True;
ADOQuery1.FilterGroup := fgNone; //[red]没问题[/red]
end;

procedure TForm1.RadioButton2Click(Sender: TObject);
begin
ADOQuery1.Filtered := True;
ADOQuery1.FilterGroup := fgPendingRecords; //[red]没问题[/red]
end;

procedure TForm1.RadioButton3Click(Sender: TObject);
begin
ADOQuery1.Filtered := True;
ADOQuery1.FilterGroup :=fgPredicate; //[red]出错[/red]
end;

这是ADO的问题吗???
 
当初好像WebBrowser有两种打印方式,使用另外一种就不会出问题。
时间不短了,记得不是特别清楚,你不妨查一下以前的帖子,或者自己再实验一下。
我对这方面不熟,所以很难帮具体的忙,呵呵。
 
  initialization
   OleInitialize(nil);
  finalization
   try
    OleUninitialize;
   except
   end;
我已经加上了,但问题依然存在
[:(]
 
后退
顶部