2015-01-08 29 views
0

我有一臺USB平板電腦,它的行爲與我想要顯示Win32窗口的顯示器相同,使用CreateWindow很容易,但我也需要用戶從這個窗口中選擇列表中的文檔並在其中顯示它們相同的顯示器如何打開和控制文檔?

我不能使用CreateProcess,因爲我不知道打開文檔的應用程序,如果我使用ShellExecuteEx打開Word文檔,我可以獲取進程的PID並在EnumWindows回調中迭代獲取實際的窗口,但是我發現這是容易出錯的,當一個圖像文檔(jpg,png等)被打開時,結構SHELLEXECUTEINFO調用ShellExecuteEx中的PID是NULL。由於Acrobat或Word可以將多個文檔保存在相同的PID下,因此該過程很容易失敗。那麼,大師們如何解決這個問題呢? (在某個位置打開文檔)

謝謝!

回答

1

SHELLEXECUTEINFO結構具有hMonitor成員,讓你指定的監視器使用,但是否應用方面,這還是不可達的應用程序,所以你會發現它並不總是工作。要使用它,請設置SEE_MASK_HMONITOR標誌並從Multiple Display Monitor functions之一獲取監視器句柄。

不幸的是,沒有完全可靠的方法來識別打開特定文件的應用程序的「主窗口」。

+0

的Word和Acrobat觀察最後一個文件被關閉的位置,而不是那個屬性。 – user311174

+0

@ user311174確切地說,它是否尊重它,取決於應用程序。沒有辦法可靠地做到這一點,這就是我所說的。 –

+0

我沒有說你錯了,的確我提高了你的答案。當我有更多的時間我想探索WebExplorer的解決方案,並在這裏如果正確的地方暴露它,其他我會接受你的答案(問題是試圖控制一個文件,不管如何) – user311174

0

雖然所有的喬納森波特說是對的,似乎這可以用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以顯示文檔,而不是下載,把一個內容類似的響應: 「內容處置」,「內聯; _file_name_.pdf」