我有一个USB平板电脑,作为一个显示器,我想要显示一个Win32窗口,这很容易使用CreateWindow,但我还需要用户从这样的窗口中选择列表中的文档并将其显示在非常相同的监视器。
我无法使用CreateProcess,因为我不知道打开文档的应用程序,如果我使用ShellExecuteEx打开Word文档,我可以获取进程的PID并在EnumWindows回调中迭代得到实际的Window但是,我发现这很容易出错,当打开图像文档(jpg,png等)时,结构SHELLEXECUTEINFO调用ShellExecuteEx的PID为NULL。此过程也很容易失败,因为Acrobat或Word可以将多个文档保存在同一个PID下。那么你们如何解决这个问题呢? (在某个地点打开文件)
谢谢!
答案 0 :(得分:1)
SHELLEXECUTEINFO
结构有一个hMonitor
成员,可让您指定要使用的监视器,但应用程序是否尊重此应用程序取决于应用程序,因此您可能会发现它没有。总是工作。要使用它,请设置SEE_MASK_HMONITOR
标志并从Multiple Display Monitor functions之一获取监视器句柄。
不幸的是,没有完全可靠的方法来识别"主窗口"打开特定文件的应用程序。
答案 1 :(得分:0)
虽然Jonathan Potter所说的都是对的,但似乎这可以通过COM来完成,Stackoverflow中没有多少文献可以链接到,所以我宁愿放一个最小的例子我发现在互联网上控制IE的大小和位置。
#include <windows.h>
#include "Mshtml.h"
void testme(void * ptr )
{
RECT * rect = (RECT *)ptr;
CLSID clsid;
LPUNKNOWN punk = NULL;
IWebBrowser2 *pWB = NULL;
IHTMLDocument2 *pHTML = NULL;
IHTMLElementCollection *pElement = NULL;
IDispatch *pdisp = NULL;
DISPID dispidNamed = DISPID_PROPERTYPUT;
VARIANT_BOOL bBusy;
VARIANT var;
OleInitialize(NULL);
CLSIDFromProgID(OLESTR("InternetExplorer.Application"), &clsid);
CoCreateInstance(clsid, NULL, CLSCTX_SERVER, IID_IUnknown, (LPVOID *)&punk);
punk->QueryInterface(IID_IWebBrowser2, (LPVOID *)&pWB);
pWB->put_Visible(TRUE);
pWB->put_Height(300);
pWB->put_Top(rect->top);
pWB->put_Left(rect->left);
pWB->put_Width(rect->right - rect->left);
pWB->put_Height(rect->bottom - rect->top);
BSTR bstrVal = SysAllocString(L"http://localhost:8080"); //Set web page on IE
var.vt = VT_I4;
var.lVal = 0;
pWB->Stop();
pWB->Navigate(bstrVal, &var, &var, &var, &var);
SysFreeString(bstrVal);
struct info info;
long IE_HWND = 0;
if (pWB->get_HWND(&IE_HWND) != S_OK)
{
AfxMessageBox("Failed: pWB->get_HWND");
return;
}
pWB->Release();
punk->Release();
OleUninitialize();
}
现在,如果您希望IE显示文档而不是下载,请在响应中添加内容,如: &#34; Content-disposition&#34;,&#34; inline; _file_name_.pdf&#34;