请问某个应用程序(进程A)如何才能让某个IE窗口(进程B)执行Save As?

blueflame 2004-10-21 10:30:32
如题,最好能用消息一类的,哪位大虾能指点一二?
...全文
246 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
etre 2004-10-23
  • 打赏
  • 举报
回复
然后通过IHTMLDocument找IOleCommandTarget接口,结果在其他地方都是可以的,而在这个地方,总是不成功
etre 2004-10-23
  • 打赏
  • 举报
回复
可能是这样的.我做了这样的一个测试
ExecWB它也是调作IOleCommandTarget接口的Exec方法
我用pBrowser首先找到IHTMLDocument的接口
LPDISPATCH lpDisp;
LPOLECOMMANDTARGET lpTarget = NULL;
m_pBrowserApp->get_Document(&lpDisp);
然后通过IHTMLDocument找到
if (lpDisp != NULL)
{
// the control will handle all printing UI

if (SUCCEEDED(lpDisp->QueryInterface(IID_IOleCommandTarget,
(LPVOID*) &lpTarget)))//这个地方返回总是不成功的
{
lpTarget->Exec(NULL, OLECMDID_PRINT, 0, NULL, NULL);
lpTarget->Release();
}
lpDisp->Release();
}
eleph0210 2004-10-22
  • 打赏
  • 举报
回复
又错了.^_^,初来乍到,不好意思.睡了.
HWND hwnd=::FindWindow(_T("IEFrame"),NULL);
if(hwnd)
{

::SendMessage(hwnd,WM_COMMAND,MAKEWPARAM(258,0),NULL);








}
eleph0210 2004-10-22
  • 打赏
  • 举报
回复
搞错了,strWinCaption应该是你打开网页的window的Caption.
我刚才是用FindWindow(_T("IEFrame",NULL)试的.

HWND IEhwnd=::FindWindow(_T("IEFrame"),strWinCaption);
if(hwnd)
{

::SendMessage(IEhwnd,WM_COMMAND,MAKEWPARAM(258,0),NULL);
}

eleph0210 2004-10-22
  • 打赏
  • 举报
回复


刚为了找IDM_SAVEAS,用Spy++找了半天,^_^

GetWindowText(hwnd,strWinCaption,TEXT_MAXSIZE);
HWND IEhwnd=::FindWindow(_T("IEFrame"),strWinCaption);
if(hwnd)
{

::SendMessage(IEhwnd,WM_COMMAND,MAKEWPARAM(258,0),NULL);
}








}
blueflame 2004-10-22
  • 打赏
  • 举报
回复
呵呵,谢谢大家的指点!
不过关于
pBrowser->ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
这句没能执行成功的原因我还是没搞懂,有谁知道吗?
蒋晟 2004-10-22
  • 打赏
  • 举报
回复
OLECMDID_SAVEAS没试过,IE的IDM_SAVEAS命令应该是可以的
roger_ding 2004-10-21
  • 打赏
  • 举报
回复
先根据IE hwnd得到 IHTMLDocument2 还有 IWebBrowser2 ,然后就可以利用上面的方法调用 Save As
blueflame 2004-10-21
  • 打赏
  • 举报
回复
spBrowser->Navigate(bstrURL,COleVariant((long) dwFlags, VT_I4),COleVariant(lpszTargetFrameName, VT_BSTR),vPostData,COleVariant(lpszHeaders, VT_BSTR));

呵呵,谢谢回复,我是想让某个之前已存在的IE窗口执行Save As
blueflame 2004-10-21
  • 打赏
  • 举报
回复
调试的输出错误是:aaa.exe中的 0x77e6e592 处最可能的异常: 0x000006F4: 传递空引用指针到承接体。 。

我把没能执行成功的那句
pBrowser->ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER, NULL, NULL);
换成
pBrowser->pBrowser->Refresh(); 或是 pBrowser->GoBack();
又能正确让指定的IE窗口执行刷新或是后退等

这个问题在这提问之前已经困扰了我好几天了,还望各位大虾能指点一二,小弟先说声谢了!
etre 2004-10-21
  • 打赏
  • 举报
回复
SHDocVw::IShellWindowsPtr m_spSHWinds=NULL;
if(m_spSHWinds == NULL)
{
CoInitialize(NULL);
if(m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)
{
CoUninitialize();
return ;
}
else
{
int n = m_spSHWinds->GetCount();//得到当前打开的IE的数目
if(n>0)
{
for(long i=0; i<n; i++)
{
variant_t v = (long)i;
IDispatchPtr spDisp = m_spSHWinds->Item(v);
SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
if(spBrowser)
{
BSTR bstrURL = url.AllocSysString();
DWORD dwFlags=0;
LPCTSTR lpszTargetFrameName="_blank";
LPCTSTR lpszHeaders=NULL;
DWORD dwPostDataLen=0;
LPVOID lpvPostData=NULL;

COleSafeArray vPostData;
if (lpvPostData != NULL)
{
if(dwPostDataLen == 0)
dwPostDataLen = lstrlen((LPCTSTR) lpvPostData);
vPostData.CreateOneDim(VT_UI1, dwPostDataLen, lpvPostData);
}
spBrowser->Navigate(bstrURL,COleVariant((long) dwFlags, VT_I4),COleVariant(lpszTargetFrameName, VT_BSTR),vPostData,COleVariant(lpszHeaders, VT_BSTR));
//spBrowser->Release();
break;
}
}
}else
ShellExecute(NULL,"Open",url,NULL,NULL,0);
}
m_spSHWinds.Release();
CoUninitialize();
}
magicsnake 2004-10-21
  • 打赏
  • 举报
回复
搬张凳子来坐一下!~~
blueflame 2004-10-21
  • 打赏
  • 举报
回复
我之前是这样用的,但在execWB时失败了,哪位大虾能帮我看看到底是哪出了问题?

SHDocVw::IShellWindowsPtr m_spSHWinds;


// 创建
if (m_spSHWinds == NULL)
{
if (m_spSHWinds.CreateInstance(__uuidof(SHDocVw::ShellWindows)) != S_OK)
{
AfxMessageBox("m_spSHWinds.CreateInstance Failed");
CoUninitialize();
EndDialog(1);
}
}

if (m_spSHWinds)
{
int n = m_spSHWinds->GetCount();
for (int i = 0; i < n; i++)
{
_variant_t v = (long)i;
IDispatchPtr spDisp = m_spSHWinds->Item(v);

SHDocVw::IWebBrowser2Ptr spBrowser(spDisp);
if (spBrowser)
{
_bstr_t bsName = spBrowser->GetLocationName();
int nPos = m_ctrlIE.InsertItem(0, bsName); //m_ctrlIE为一个listctrl
spBrowser->AddRef();
void *pData = spBrowser;
m_ctrlIE.SetItemData(nPos, (DWORD_PTR)(pData));
}
}
}

……
// 在用户选中listctrl中的相关窗口后

int n = m_ctrlIE.GetItemCount();
for (int i = 0; i < n; i++)
{
if (m_ctrlIE.GetCheck(i))
{
IWebBrowser2 *pBrowser = (IWebBrowser2 *)m_ctrlIE.GetItemData(i);

if (pBrowser)
{
pBrowser->ExecWB(OLECMDID_SAVEAS, OLECMDEXECOPT_PROMPTUSER, NULL, NULL); //这句没能执行成功
}
}
}
etre 2004-10-21
  • 打赏
  • 举报
回复
spBrowser->ExecWB
我对IEWebBrowser这个组件的execWB方法整理了一下﹐希望对大家有所帮助。
1. <object id="WebBrowser" width=0 height=0 classid="CLSID:8856F961-340A-11D0-A96B-00C04FD705A2"></object>
2. 调用方法。
WebBrowser.ExecWB nCmdID, nCmdExecOpt, [pvaIn], [pvaOut]
3. 参数说明。
(a).nCmdID
OLECMDID_OPEN = 1,
OLECMDID_NEW = 2,
OLECMDID_SAVE = 3,
OLECMDID_SAVEAS = 4,
OLECMDID_SAVECOPYAS = 5,
OLECMDID_PRINT = 6,
OLECMDID_PRINTPREVIEW = 7,
OLECMDID_PAGESETUP = 8,
OLECMDID_SPELL = 9,
OLECMDID_PROPERTIES = 10,
OLECMDID_CUT = 11,
OLECMDID_COPY = 12,
OLECMDID_PASTE = 13,
OLECMDID_PASTESPECIAL = 14,
OLECMDID_UNDO = 15,
OLECMDID_REDO = 16,
OLECMDID_SELECTALL = 17,
OLECMDID_CLEARSELECTION = 18,
OLECMDID_ZOOM = 19,
OLECMDID_GETZOOMRANGE = 20
OLECMDID_UPDATECOMMANDS = 21
OLECMDID_REFRESH = 22
OLECMDID_STOP = 23
OLECMDID_HIDETOOLBARS = 24
OLECMDID_SETPROGRESSMAX = 25
OLECMDID_SETPROGRESSPOS = 26
OLECMDID_SETPROGRESSTEXT = 27
OLECMDID_SETTITLE = 28
OLECMDID_SETDOWNLOADSTATE = 29
OLECMDID_STOPDOWNLOAD = 30
上面的关键词都可以在浏览器的菜单里面找到对应的选项﹐大家一看就明白的﹗
(b).nCmdExecOpt
OLECMDEXECOPT_DODEFAULT = 0,
OLECMDEXECOPT_PROMPTUSER = 1,
LECMDEXECOPT_DONTPROMPTUSER = 2,
OLECMDEXECOPT_SHOWHELP = 3
对于这个参数﹐一般来说﹐选1就可以了。

etre 2004-10-21
  • 打赏
  • 举报
回复
spBrowser->Navigate(bstrURL,COleVariant((long) dwFlags, VT_I4),COleVariant(lpszTargetFrameName, VT_BSTR),vPostData,COleVariant(lpszHeaders, VT_BSTR));
这个是打开一个新的窗口,spBrowser,这就是得到的IE的IWebBrowser2指针,你在调用里面的方法存就是了啊。
oyljerry 2004-10-21
  • 打赏
  • 举报
回复
得到窗口句柄,然后Save As

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧