VC Webbrowser操作全解(三)

3900 ワード

この章では、Webbrowserがユーザーのアップロードファイルをシミュレートする方法について説明します.
(8)アナログアップロードファイル
まず、ユーザーがアップロードボタンをクリックしてClickButtonメソッドを呼び出すことをシミュレートします.
nRet = ClickButton(_T("load_file('/fileWtWindow.jsp',' ')"), _T("input"), _T("onclick"), _T("myframe"));

URLロード完了メッセージでロード完了したURLを判断します.WebbrowserはUIホストプログラムと同じスレッドを共有しているので、判断が終わったらタイマーでブラウズボタンを呼び出すことができます.
    BOOL OnUrlCompleteEvent(void* pParam)
	{
		std::wstring strURL = (wchar_t*)pParam;
		DUI__Trace(_T("URL Finish:%s"), strURL.c_str());
		
		// 
		if (strURL.find(_T("/fileWtWindow.jsp")) != std::string::npos)
		{
            // 
			SetTimer(m_hWnd, 0x107, 5000,NULL);
		}
		else if (strURL.find(_T("/fileUpload_returnFileResult.xhtml")) != std::string::npos)
		{
			SetTimer(m_hWnd, 0x11E, 5000, NULL);
		}

		return TRUE;
	}

タイマー:
else if (wParam == 0x107)
{
	KillTimer(m_hWnd, 0x107);
	UploadFile( _T("fileWt"), _T("file_submit"), _T("G:\\trademark\\ .jpg"), _T("myframe"), UPLOAD_FILE_TYPE_AGENT);

}

アップロードファイル実装操作:アップロードインタフェースのiFrame要素ノード(以下コードのifr_popup 0はiFrame要素iD)を取得し、対応するブラウズボタンを取得し、選択ファイルをシミュレートした後、アップロード操作をクリックする
xny::Integer UploadFile(LPCTSTR lpEditName, LPCTSTR lpFunName, LPCTSTR lpFilePath, LPCTSTR lpParentName, UPLOAD_FILE_TYPE type)
	{
		xny::Integer nRet = nsny::eProbeErr::NYERR_FAIL;
		do 
		{
			// 

			// 
			CComPtrpElement = NULL;
			
			CComPtr pIFrame = (IHTMLIFrameElement*)m_pWebBrowserEx->GetElementByName(_T("ifr_popup0"), lpParentName, IID_IHTMLIFrameElement);
			if (pIFrame)
			{
				pElement = (IHTMLInputFileElement *)m_pWebBrowserEx->GetElementByName(lpEditName, pIFrame, IID_IHTMLInputFileElement);
			}
			if (pElement == 0) break;
			
			// 
			m_strPath = lpFilePath;
			m_upLoadFileType = type;
			// , 
			SetTimer(m_hWnd, 0x200, 2000, NULL);

			VARIANT params[10];
			VARIANT ret;
			CWebBrowserEx::InvokeMethod(pElement, _T("click"), &ret, params, 0);
						
			DUI__Trace(_T(" "));
			// 
			ClickButton(_T("laodBut"), NULL, NULL, lpParentName, _T("ifr_popup0"));
			//
		} while (0);
		return nRet;
	}

ブラウズファイルウィンドウの検出コード:
// 
else if (wParam == 0x200)
{
	KillTimer(m_hWnd, 0x200);
	//
	HWND hWnd = FindWindow(L"#32770", L" ");
	if (hWnd != NULL)
	{
		
		HWND hEdit = hWnd;
		EnumChildWindows(hWnd, EnumEditProc, (LPARAM)m_strPath.c_str());
	}
}

// 
BOOL CALLBACK EnumEditProc(
	HWND hWnd,      // handle to child window
	LPARAM   lParam // application-defined value
	)
{
	TCHAR szClassName[256] = { 0 };
	std::wstring strText = (LPCTSTR)lParam;
	do
	{
		GetClassName(hWnd, szClassName, 256);
		std::wstring strClassName = szClassName;
		if (strClassName == L"Edit")
		{
			::SetWindowText(hWnd, strText.c_str());

			LPTSTR lpszProgress = new TCHAR[strText.size() + 1];
			_tcscpy_s(lpszProgress, strText.size() + 1, strText.c_str());
			HRESULT hRet = ::SendMessage(hWnd, WM_SETTEXT, NULL, (LPARAM)lpszProgress);
			if (hRet == CB_ERRSPACE)
			{
				DUI__Trace(_T("SetText Faild"));
			}
			delete[] lpszProgress;
			lpszProgress = NULL;
		}
		else if (strClassName == L"Button")
		{
			TCHAR szWndText[256] = { 0 };
			GetWindowText(hWnd, szWndText, 256);
			std::wstring strWndText = szWndText;
			if (strWndText.find(L" ") != -1 || strWndText.find(L"Open") != -1)
			{
				HRESULT hRet = ::SendMessage(hWnd, WM_LBUTTONDOWN, NULL, MAKELPARAM(50, 17));
				hRet = ::SendMessage(hWnd, WM_LBUTTONUP, NULL, MAKELPARAM(50, 17));
				if (hRet  == 0)
				{
					DUI__Trace(_T(" "));
				}
			}
		}
		
	} while (0);
	return true;
}

(9)時間コントロール(未完待機)