diff --git a/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.user b/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.user index bdd86c0..530d292 100644 --- a/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.user +++ b/OfficeAssistant_msvc/OfficeAssistant_msvc.vcxproj.user @@ -9,9 +9,9 @@ WindowsLocalDebugger - 2023-08-18T11:11:43.0072355Z + 2023-09-18T12:55:53.6703998Z - 2023-08-18T11:11:44.6602281Z + 2023-09-18T12:55:55.7491129Z \ No newline at end of file diff --git a/OfficeAssistant_msvc/qminiblink.cpp b/OfficeAssistant_msvc/qminiblink.cpp index 0643b8a..36f3099 100644 --- a/OfficeAssistant_msvc/qminiblink.cpp +++ b/OfficeAssistant_msvc/qminiblink.cpp @@ -1,8 +1,82 @@ -#include "qminiblink.h" +#include "qminiblink.h" + +#include #include #include +#include #pragma comment (lib,"Comctl32.lib") +struct DownInfo { + std::string url; + size_t recvSize; + size_t allSize; +}; + +void MB_CALL_TYPE onNetJobDataRecvCallback(void* ptr, mbNetJob job, const char* data, int length) +{ + DownInfo* info = (DownInfo*)ptr; + info->recvSize += length; + + char* output = (char*)malloc(0x1000); + sprintf_s(output, 0x990, "onNetJobDataRecvCallback: %d %d, %f\n", info->allSize, info->recvSize, info->recvSize / (info->allSize + 1.0)); + OutputDebugStringA(output); + free(output); +} + +unsigned int __stdcall msgBoxThread(void* param) +{ + std::function* callback = (std::function*)param; + (*callback)(); + delete callback; + return 0; +} + +void MB_CALL_TYPE onNetJobDataFinishCallback(void* ptr, mbNetJob job, mbLoadingResult result) +{ + OutputDebugStringA("onNetJobDataFinishCallback\n"); + + std::wstring* title = new std::wstring; + *title += L" 下载完成:"; + std::function* callback = new std::function([title, result] { + LPCWSTR lpCaption = (result == MB_LOADING_SUCCEEDED ? L"下载成功" : L"下载失败"); + MessageBoxW(nullptr, title->c_str(), lpCaption, MB_OK); + delete title; + }); + + unsigned int threadId = 0; // 为了不卡blink线程,messagbox放到另外个线程弹出 + std::thread msgBox(msgBoxThread, callback); + msgBox.detach(); +} + +static mbDownloadOpt MB_CALL_TYPE onDownloadCallback(mbWebView webView, + void* param, + size_t expectedContentLength, + const char* url, + const char* mime, + const char* disposition, + mbNetJob job, + mbNetJobDataBind* dataBind) +{ + char* output = (char*)malloc(0x8000); + sprintf_s(output, 0x7990, "onDownloadCallback: %d %s\n", expectedContentLength, url); + OutputDebugStringA(output); + free(output); + + DownInfo* info = new DownInfo(); + info->url = url; + info->recvSize = 0; + info->allSize = expectedContentLength; + + mbDownloadBind bind = { 0 }; + bind.param = info; + bind.recvCallback = onNetJobDataRecvCallback; + bind.finishCallback = onNetJobDataFinishCallback; + bind.saveNameCallback = nullptr; + + return mbPopupDialogAndDownload(webView, nullptr, expectedContentLength, url, mime, disposition, job, dataBind, &bind); + //return mbDownloadByPath(webView, nullptr, L"P:\\", expectedContentLength, url, mime, disposition, job, dataBind, &bind); +} + QMiniBlink::QMiniBlink(QWidget *parent) : QWidget(parent){ @@ -26,6 +100,7 @@ void QMiniBlink::init() { mbMoveWindow(this->mbView, 0, 0, rect.right - rect.left, rect.bottom - rect.top); //while(this->firstUrl.isEmpty()){} //mbLoadURL(this->mbView, this->firstUrl.toStdString().c_str()); + mbOnDownloadInBlinkThread(mbView,onDownloadCallback, nullptr); SetWindowSubclass((HWND)this->winId(), subClassProc, 0, (DWORD_PTR)this); //mbRunMessageLoop(); }