mirror of
https://github.com/modernw/AppInstallerForWin8.git
synced 2026-04-12 01:07:18 +10:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c4962cc7ee | ||
|
|
c414259e7a | ||
|
|
478d2580da | ||
|
|
e2d78df375 | ||
|
|
99df99dd9f |
@@ -114,8 +114,8 @@ IDR_MANIFEST1 RT_MANIFEST "res/manifest.xml"
|
||||
//
|
||||
|
||||
IDR_VERSION_ZH_CN VERSIONINFO
|
||||
FILEVERSION 1,0,1,9
|
||||
PRODUCTVERSION 1,0,1,9
|
||||
FILEVERSION 1,0,1,11
|
||||
PRODUCTVERSION 1,0,1,11
|
||||
FILEFLAGSMASK 0x0L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -132,9 +132,9 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Bruce Winter"
|
||||
VALUE "FileDescription", "应用安装程序"
|
||||
VALUE "FileVersion", "1.0.1.9"
|
||||
VALUE "FileVersion", "1.0.1.11"
|
||||
VALUE "LegalCopyright", "\\xA9Bruce Winter. All rights reserved."
|
||||
VALUE "ProductVersion", "1.0.1.9"
|
||||
VALUE "ProductVersion", "1.0.1.11"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
@@ -144,8 +144,8 @@ BEGIN
|
||||
END
|
||||
|
||||
IDR_VERSION_EN_US VERSIONINFO
|
||||
FILEVERSION 1,0,1,9
|
||||
PRODUCTVERSION 1,0,1,9
|
||||
FILEVERSION 1,0,1,11
|
||||
PRODUCTVERSION 1,0,1,11
|
||||
FILEFLAGSMASK 0x0L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -162,9 +162,9 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Bruce Winter"
|
||||
VALUE "FileDescription", "App Installer"
|
||||
VALUE "FileVersion", "1.0.1.9"
|
||||
VALUE "FileVersion", "1.0.1.11"
|
||||
VALUE "LegalCopyright", "\\xA9Bruce Winter. All rights reserved."
|
||||
VALUE "ProductVersion", "1.0.1.9"
|
||||
VALUE "ProductVersion", "1.0.1.11"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
@@ -241,9 +241,12 @@ BEGIN
|
||||
APPLIST_WINTITLE "应用选择列表"
|
||||
APPLIST_TITLE "你要从哪个应用开始?"
|
||||
APPLIST_BUTTON_CANCEL "取消"
|
||||
SHORTCUT_SETTINGS "设置"
|
||||
SHORTCUT_UNINSTALL "删除 应用安装程序"
|
||||
SHORTCUT_UPDATE "更新 App Installer"
|
||||
CLHELP_1 "命令行参数说明:\n\n"
|
||||
CLHELP_2 "\t/?, /Help\n\t显示帮助窗口 (命令行参数说明)\n\n"
|
||||
CLHELP_3 "\t/DisableFrame\n\t禁止使用自绘的窗口边框\n\n"
|
||||
CLHELP_3 "\t/DisableFrame\n\t禁止使用自绘的窗口边框 (仅用于易程序)\n\n"
|
||||
CLHELP_4 "\t/Win32Window\n\t不使用 WebUI,改用 Win32 窗口\n\n"
|
||||
CLHELP_5 "\t/Silent\n\t一般情况下会自动安装,安装完成后在几秒后结束\n\n"
|
||||
CLHELP_6 "\t/VerySilent\n\t静默安装,安装时不会显示任何信息,安装任务完成后自动结束\n\n"
|
||||
@@ -269,6 +272,9 @@ END
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
CLHELP_7 "\t/NoGUI\n\t使用 WSAppPkgIns 安装。安装时会弹出命令行窗口,安装完成后需手动关闭窗口\n\n"
|
||||
CLHELP_8 "\t/EnableFrame\n\t使用自绘的窗口边框 (仅用于易程序)\n\n"
|
||||
CLHELP_9 "\t/EProgram\n\t使用易的 WebUI\n\n"
|
||||
CLHELP_10 "\t/Console\n\t使用命令行版的 应用安装程序 (其实建议直接使用 AppInstallerConsole.exe 才更方便看输入输出)\n\n"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
@@ -409,9 +415,12 @@ BEGIN
|
||||
APPLIST_WINTITLE "App Select List"
|
||||
APPLIST_TITLE "Which app do you want to start with?"
|
||||
APPLIST_BUTTON_CANCEL "Cancel"
|
||||
SHORTCUT_SETTINGS "Settings"
|
||||
SHORTCUT_UNINSTALL "Delete App Installer"
|
||||
SHORTCUT_UPDATE "Update App Installer"
|
||||
CLHELP_1 "Usage:\n\n"
|
||||
CLHELP_2 "\t/?, /Help\n\tDisplay help window (command line parameter description).\n\n"
|
||||
CLHELP_3 "\t/DisableFrame\n\tDisable the use of self-drawn window borders.\n\n"
|
||||
CLHELP_3 "\t/DisableFrame\n\tDisable the use of self-drawn window borders. (Only use for E program.)\n\n"
|
||||
CLHELP_4 "\t/Win32Window\n\tDo not use WebUI, use Win32 window instead.\n\n"
|
||||
CLHELP_5 "\t/Silent\n\tUnder normal circumstances, it will be automatically installed and will end after a few seconds.\n\n"
|
||||
CLHELP_6 "\t/VerySilent\n\tSilent installation, no information will be displayed during installation, and the installation task will automatically end after completion.\n\n"
|
||||
@@ -429,6 +438,9 @@ END
|
||||
STRINGTABLE
|
||||
BEGIN
|
||||
CLHELP_7 "\t/NoGUI\n\tUse WSAppPkgIns to install. A command line window will pop up during installation, and you need to manually close the window after installation.\n\n"
|
||||
CLHELP_8 "\t/EnableFrame\n\tEnable the use of self-drawn window borders. (Only use for E program.)\n\n"
|
||||
CLHELP_9 "\t/EProgram\n\tUse E WebUI program.\n\n"
|
||||
CLHELP_10 "\t/Console\n\tUse the command line version of the application installer (it is actually recommended to use AppInstallerConsole.exe directly for easier viewing of input and output)\n\n"
|
||||
END
|
||||
|
||||
STRINGTABLE
|
||||
|
||||
@@ -142,6 +142,7 @@
|
||||
<AdditionalManifestFiles>app.manifest %(AdditionalManifestFiles)</AdditionalManifestFiles>
|
||||
<InputResourceManifests>
|
||||
</InputResourceManifests>
|
||||
<EnableDpiAwareness>false</EnableDpiAwareness>
|
||||
</Manifest>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">
|
||||
|
||||
@@ -1,17 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- Windows 10 -->
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"
|
||||
xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- Windows 10 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
<!-- Windows 8.1 -->
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<!-- Windows Vista -->
|
||||
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
|
||||
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
|
||||
<!-- Windows 7 -->
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||
<!-- Windows 8 -->
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
</application>
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a4e38}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
|
||||
<!-- 高DPI感知配置(兼容旧版SDK) -->
|
||||
<asmv3:application>
|
||||
<asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
|
||||
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">True/PM</dpiAware>
|
||||
</asmv3:windowsSettings>
|
||||
</asmv3:application>
|
||||
|
||||
</assembly>
|
||||
@@ -29,6 +29,7 @@ using namespace System;
|
||||
using namespace System::Windows::Forms;
|
||||
using namespace System::Threading;
|
||||
using namespace msclr::interop;
|
||||
using namespace System::Runtime::InteropServices;
|
||||
|
||||
int GetScreenWidth ()
|
||||
{
|
||||
@@ -44,6 +45,9 @@ int GetScreenHeight ()
|
||||
#define toBool(_String_Managed_Object_) Boolean::Parse (_String_Managed_Object_)
|
||||
#define toDateTime(_String_Managed_Object_) DateTime::Parse (_String_Managed_Object_)
|
||||
|
||||
extern int iDpi = GetDPI ();
|
||||
extern double dDpi = iDpi * 0.01;
|
||||
|
||||
String ^GetRCString_NET (UINT resID)
|
||||
{
|
||||
size_t bufferSize = 256;
|
||||
@@ -206,9 +210,6 @@ void SetWebBrowserEmulation ()
|
||||
System::Runtime::InteropServices::Marshal::FreeHGlobal (appNamePtr);
|
||||
}
|
||||
|
||||
#include <windows.h>
|
||||
#include <string>
|
||||
|
||||
bool IsIeVersion10 ()
|
||||
{
|
||||
HKEY hKey;
|
||||
@@ -335,43 +336,27 @@ void OutputDebugStringFormatted (const wchar_t* format, ...);
|
||||
public ref class AppWindow: public Form
|
||||
{
|
||||
private:
|
||||
WebBrowser ^webUI;
|
||||
System::Windows::Forms::WebBrowser ^webUI;
|
||||
std::vector <appmap> *appItems = new std::vector <appmap> ();
|
||||
System::Collections::Generic::Dictionary <String ^, Delegate ^> ^jsFunctionHandlers;
|
||||
public:
|
||||
AppWindow ()
|
||||
{
|
||||
BOOL transitionsEnabled = FALSE;
|
||||
HRESULT hr = DwmSetWindowAttribute (
|
||||
reinterpret_cast <HWND> (this->Handle.ToPointer ()),
|
||||
DWMWA_TRANSITIONS_FORCEDISABLED,
|
||||
&transitionsEnabled,
|
||||
sizeof (transitionsEnabled)
|
||||
);
|
||||
DWMNCRENDERINGPOLICY dwmplc = DWMNCRP_ENABLED;
|
||||
hr = DwmSetWindowAttribute (
|
||||
reinterpret_cast <HWND> (this->Handle.ToPointer ()),
|
||||
DWMWA_NCRENDERING_POLICY,
|
||||
&dwmplc,
|
||||
sizeof (dwmplc)
|
||||
);
|
||||
MARGINS margins = {-1, -1, -1, -1};
|
||||
hr = DwmExtendFrameIntoClientArea (
|
||||
reinterpret_cast <HWND> (this->Handle.ToPointer ()),
|
||||
&margins
|
||||
);
|
||||
this->Visible = false;
|
||||
this->DoubleBuffered = true;
|
||||
jsFunctionHandlers = gcnew System::Collections::Generic::Dictionary <String ^, Delegate ^> ();
|
||||
this->FormBorderStyle = System::Windows::Forms::FormBorderStyle::None;
|
||||
this->ShowInTaskbar = false;
|
||||
this->TopMost = true;
|
||||
this->Size = System::Drawing::Size (392, 494);
|
||||
if (IsWindows10AndLater ()) this->MinimumSize = System::Drawing::Size (392, 226);
|
||||
else this->MinimumSize = System::Drawing::Size (392, 129);
|
||||
if (IsWindows10AndLater ()) this->MaximumSize = System::Drawing::Size (392, 522);
|
||||
else this->MaximumSize = System::Drawing::Size (368, 394);
|
||||
this->Size = System::Drawing::Size (392 * dDpi, 494 * dDpi);
|
||||
if (IsWindows10AndLater ()) this->MinimumSize = System::Drawing::Size (392 * dDpi, 226 * dDpi);
|
||||
else this->MinimumSize = System::Drawing::Size (392 * dDpi, 129 * dDpi);
|
||||
if (IsWindows10AndLater ()) this->MaximumSize = System::Drawing::Size (392 * dDpi, 522 * dDpi);
|
||||
else this->MaximumSize = System::Drawing::Size (368 * dDpi, 394 * dDpi);
|
||||
this->Text = rcString (APPLIST_WINTITLE);
|
||||
webUI = gcnew WebBrowser ();
|
||||
webUI = gcnew System::Windows::Forms::WebBrowser ();
|
||||
webUI->Dock = DockStyle::Fill;
|
||||
webUI->Visible = false;
|
||||
this->Controls->Add (webUI);
|
||||
String ^rootDir = System::IO::Path::GetDirectoryName (System::Windows::Forms::Application::ExecutablePath);
|
||||
String ^htmlFilePath = System::IO::Path::Combine (rootDir, "HTML\\Libs\\AppList.html");
|
||||
@@ -386,6 +371,7 @@ public ref class AppWindow: public Form
|
||||
}
|
||||
void OnDocumentCompleted (Object ^sender, WebBrowserDocumentCompletedEventArgs ^e)
|
||||
{
|
||||
this->CallJSFunction ("SetHighDpiMode", gcnew array <Object ^> { 2 });
|
||||
CallJSFunction ("SetText", gcnew array <Object ^> {
|
||||
"span-title",
|
||||
rcString (APPLIST_TITLE)
|
||||
@@ -396,8 +382,10 @@ public ref class AppWindow: public Form
|
||||
});
|
||||
Thread ^thread = gcnew Thread (gcnew ThreadStart (this, &AppWindow::InvokeRefreshAppItems));
|
||||
thread->Start ();
|
||||
webUI->Visible = true; // **加载完成后显示 webUI**
|
||||
this->Visible = true;
|
||||
}
|
||||
void SendAppData (std::vector<appmap> apps)
|
||||
void SendAppData (std::vector <appmap> apps)
|
||||
{
|
||||
if (appItems) delete appItems;
|
||||
appItems = nullptr;
|
||||
@@ -410,9 +398,21 @@ public ref class AppWindow: public Form
|
||||
}
|
||||
void eventLaunchApp (String ^appModelUserId)
|
||||
{
|
||||
taskLaunchApp (appModelUserId);
|
||||
}
|
||||
void taskLaunchApp (Object ^parameter)
|
||||
{
|
||||
String^ aMUId = safe_cast <String ^> (parameter);
|
||||
DWORD dwPId = 0;
|
||||
LaunchApp ((marshal_as <std::wstring> (appModelUserId)).c_str (), &dwPId);
|
||||
this->Close ();
|
||||
LaunchApp ((marshal_as <std::wstring> (aMUId)).c_str (), &dwPId);
|
||||
if (this->InvokeRequired)
|
||||
{
|
||||
if (this->IsHandleCreated) this->Invoke (gcnew Action (this, &AppWindow::Close));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (this->IsHandleCreated) this->Close ();
|
||||
}
|
||||
}
|
||||
void eventCancelWindow ()
|
||||
{
|
||||
@@ -459,9 +459,9 @@ public ref class AppWindow: public Form
|
||||
{
|
||||
CallJSFunction ("ClearListItems", gcnew array <Object ^> { });
|
||||
bool isWin10 = IsWindows10AndLater ();
|
||||
size_t height = ((appItems->size ()) * (isWin10 ? 50 : 60)) + (isWin10 ? 206 : 120);
|
||||
if (height < (isWin10 ? 522 : 394)) this->Height = height;
|
||||
else this->Height = 522;
|
||||
size_t height = ((appItems->size ()) * (isWin10 ? 50 : 60) * dDpi) + (isWin10 ? 206 : 120) * dDpi;
|
||||
if (height < (isWin10 ? 522 : 394) * dDpi) this->Height = height;
|
||||
else this->Height = 522 * dDpi;
|
||||
this->Left = (GetScreenWidth () - this->Width) / 2;
|
||||
this->Top = (GetScreenHeight () - this->Height) / 2;
|
||||
for (auto it : *appItems)
|
||||
@@ -476,30 +476,44 @@ public ref class AppWindow: public Form
|
||||
});
|
||||
}
|
||||
}
|
||||
protected:
|
||||
virtual void OnHandleCreated (EventArgs^ e) override
|
||||
{
|
||||
Form::OnHandleCreated (e);
|
||||
if (Environment::OSVersion->Version->Major >= 6)
|
||||
{
|
||||
MARGINS margins = {0, 0, 0, 0};
|
||||
HRESULT hr = DwmExtendFrameIntoClientArea ((HWND)this->Handle.ToPointer (), &margins);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
public ref class MainWnd: public Form
|
||||
{
|
||||
private:
|
||||
WebBrowser ^webUI;
|
||||
System::Windows::Forms::WebBrowser ^webUI;
|
||||
int page;
|
||||
System::Collections::Generic::Dictionary <String ^, Delegate ^> ^jsFunctionHandlers;
|
||||
System::Windows::Forms::Timer^ fadeTimer;
|
||||
public:
|
||||
MainWnd (): page (-1)
|
||||
{
|
||||
jsFunctionHandlers = gcnew System::Collections::Generic::Dictionary <String ^, Delegate ^> ();
|
||||
this->Opacity = 0.0;
|
||||
initWnd ();
|
||||
}
|
||||
private:
|
||||
void initWnd ()
|
||||
{
|
||||
this->Visible = false;
|
||||
this->webUI = gcnew WebBrowser ();
|
||||
this->DoubleBuffered = true;
|
||||
this->BackColor = System::Drawing::Color::FromArgb (0, 120, 215);
|
||||
SetWebBrowserEmulation ();
|
||||
this->webUI = gcnew System::Windows::Forms::WebBrowser ();
|
||||
this->webUI->BackColor = this->BackColor;
|
||||
this->SuspendLayout ();
|
||||
this->webUI->Dock = DockStyle::Fill;
|
||||
this->webUI->DocumentCompleted += gcnew WebBrowserDocumentCompletedEventHandler (this, &MainWnd::eventOnDocumentCompleted);
|
||||
this->webUI->IsWebBrowserContextMenuEnabled = false;
|
||||
this->webUI->PreviewKeyDown += gcnew System::Windows::Forms::PreviewKeyDownEventHandler (this, &MainWnd::eventOnPreviewKeyDown_WebBrowser);
|
||||
this->Controls->Add (this->webUI);
|
||||
HICON tempIco = LoadRCIcon (ICON_TASKBAR);
|
||||
if (tempIco)
|
||||
@@ -523,10 +537,10 @@ public ref class MainWnd: public Form
|
||||
}
|
||||
else
|
||||
{
|
||||
wid = m_initConfig.readUIntValue (L"Settings", L"SavePosWidth",
|
||||
wid = m_initConfig.readUIntValue (L"Settings", L"PosWidth",
|
||||
(unsigned)_wtol (GetRCString_cpp (INITWIDTH).c_str ())
|
||||
);
|
||||
hei = m_initConfig.readUIntValue (L"Settings", L"SavePosHeight",
|
||||
hei = m_initConfig.readUIntValue (L"Settings", L"PosHeight",
|
||||
(unsigned)_wtol (GetRCString_cpp (INITHEIGHT).c_str ())
|
||||
);
|
||||
}
|
||||
@@ -535,21 +549,22 @@ public ref class MainWnd: public Form
|
||||
m_initConfig.readUIntValue (L"Settings", L"MinPosHeight", (unsigned)_wtol (GetRCString_cpp (LIMITHEIGHT).c_str ()))
|
||||
);
|
||||
this->WindowState = (System::Windows::Forms::FormWindowState)m_initConfig.readIntValue (L"Settings", L"WindowPos", (int)System::Windows::Forms::FormWindowState::Normal);
|
||||
this->ClientSize = System::Drawing::Size (wid, hei);
|
||||
this->ClientSize = System::Drawing::Size (wid * dDpi, hei * dDpi);
|
||||
this->Text = GetRCString (WIN_TITLE);
|
||||
this->ResumeLayout (false);
|
||||
webUI->ObjectForScripting = this;
|
||||
this->webUI->DocumentCompleted += gcnew WebBrowserDocumentCompletedEventHandler (this, &MainWnd::eventOnDocumentCompleted);
|
||||
this->webUI->PreviewKeyDown += gcnew System::Windows::Forms::PreviewKeyDownEventHandler (this, &MainWnd::eventOnPreviewKeyDown_WebBrowser);
|
||||
this->Resize += gcnew System::EventHandler (this, &MainWnd::eventOnResize);
|
||||
this->Load += gcnew EventHandler (this, &MainWnd::eventOnCreate);
|
||||
this->ResizeEnd += gcnew EventHandler (this, &MainWnd::eventOnResizeEnd);
|
||||
this->ResumeLayout (false);
|
||||
this->Resize += gcnew System::EventHandler (this, &MainWnd::eventOnResize);
|
||||
}
|
||||
void eventOnCreate (System::Object ^sender, System::EventArgs ^e)
|
||||
{
|
||||
SetWebBrowserEmulation ();
|
||||
String ^rootDir = System::IO::Path::GetDirectoryName (System::Windows::Forms::Application::ExecutablePath);
|
||||
String ^htmlFilePath = System::IO::Path::Combine (rootDir, "HTML\\Index.html");
|
||||
if (IsIeVersion10 ()) htmlFilePath = System::IO::Path::Combine (rootDir, "HTML\\IndexIE10.html"); // IE10 (Win8) 特供
|
||||
webUI->Navigate (htmlFilePath);
|
||||
webUI->ObjectForScripting = this;
|
||||
}
|
||||
void eventOnPreviewKeyDown_WebBrowser (System::Object ^sender, System::Windows::Forms::PreviewKeyDownEventArgs ^e)
|
||||
{
|
||||
@@ -560,9 +575,25 @@ public ref class MainWnd: public Form
|
||||
{
|
||||
if (e->Url->ToString () == webUI->Url->ToString ())
|
||||
{
|
||||
eventOnPageLoad ();
|
||||
this->CallJSFunction ("SetHighDpiMode", gcnew array <Object ^> { 2 });
|
||||
this->CallJSFunction ("SetPageZoom", gcnew array <Object ^> { dDpi });
|
||||
this->Visible = true;
|
||||
fadeTimer = gcnew System::Windows::Forms::Timer ();
|
||||
fadeTimer->Interval = 5;
|
||||
fadeTimer->Tick += gcnew EventHandler (this, &MainWnd::fadeTimer_Tick);
|
||||
fadeTimer->Start ();
|
||||
this->setLaunchWhenReadyJS (m_initConfig.readBoolValue (L"Settings", L"LaunchWhenReady", true));
|
||||
Thread ^thread = gcnew Thread (gcnew ThreadStart (this, &MainWnd::taskReadFile));
|
||||
thread->Start ();
|
||||
Thread ^thread2 = gcnew Thread (gcnew ThreadStart (this, &MainWnd::taskCountDarkMode));
|
||||
thread2->Start ();
|
||||
}
|
||||
}
|
||||
void fadeTimer_Tick (Object^ sender, EventArgs^ e)
|
||||
{
|
||||
if (this->Opacity < 1.0) this->Opacity += 0.2;
|
||||
else fadeTimer->Stop ();
|
||||
}
|
||||
void eventOnResizeEnd (Object ^sender, EventArgs ^e)
|
||||
{
|
||||
if (this->WindowState == FormWindowState::Maximized)
|
||||
@@ -574,7 +605,7 @@ public ref class MainWnd: public Form
|
||||
this->changeMaxDisplayPicJS (false);
|
||||
}
|
||||
}
|
||||
void eventOnResize (Object ^sender, EventArgs ^e)
|
||||
void adjustWhenResize ()
|
||||
{
|
||||
if (this->WindowState == FormWindowState::Maximized)
|
||||
{
|
||||
@@ -587,22 +618,44 @@ public ref class MainWnd: public Form
|
||||
this->changeMaxDisplayPicJS (false);
|
||||
if (m_initConfig.readBoolValue (L"Settings", L"SavePosBeforeClosing"))
|
||||
{
|
||||
m_initConfig.writeUIntValue (L"Settings", L"SavePosWidth", this->Width);
|
||||
m_initConfig.writeUIntValue (L"Settings", L"SavePosHeight", this->Height);
|
||||
System::Drawing::Size ^client = this->ClientSize;
|
||||
if (dDpi == 1)
|
||||
{
|
||||
m_initConfig.writeUIntValue (L"Settings", L"SavePosWidth", client->Width);
|
||||
m_initConfig.writeUIntValue (L"Settings", L"SavePosHeight", client->Height);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_initConfig.writeUIntValue (L"Settings", L"SavePosWidth", client->Width / dDpi);
|
||||
m_initConfig.writeUIntValue (L"Settings", L"SavePosHeight", client->Height / dDpi);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this->webUI->IsHandleCreated)
|
||||
{
|
||||
UINT resID = 0;
|
||||
switch (page)
|
||||
{
|
||||
case 2: resID = PAGE_1_TITLE; break;
|
||||
case 3: resID = PAGE_2_TITLE; break;
|
||||
case 4: resID = PAGE_4_TITLE; break;
|
||||
case 5: resID = PAGE_5_TITLE; break;
|
||||
}
|
||||
if (resID)
|
||||
{
|
||||
std::wstring title = m_pkgInfo.getPropertyName ();
|
||||
std::wstring temp = StrPrintFormatW (GetRCString_cpp (resID).c_str (), L" ");
|
||||
std::wstring temp1 = temp + title;
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (temp1.c_str ()), (size_t)2);
|
||||
std::wstring sub = title.substr (0, title.length () - reduce) + (reduce > 3 ? L"..." : L"");
|
||||
setTextJS ("caption-title", gcnew String (StrPrintFormatW (GetRCString_cpp (resID).c_str (), sub.c_str ()).c_str ()));
|
||||
// this->CallJSFunction ("adjustTextareaHeight", gcnew array <Object ^> {});
|
||||
}
|
||||
}
|
||||
}
|
||||
void eventOnPageLoad ()
|
||||
void eventOnResize (Object ^sender, EventArgs ^e)
|
||||
{
|
||||
this->Visible = true;
|
||||
this->setLaunchWhenReadyJS (m_initConfig.readBoolValue (L"Settings", L"LaunchWhenReady", true));
|
||||
#ifdef _DEBUG
|
||||
if (IsIeVersion10 ()) hideFrameJS (false);
|
||||
#endif
|
||||
Thread ^thread = gcnew Thread (gcnew ThreadStart (this, &MainWnd::taskReadFile));
|
||||
thread->Start ();
|
||||
Thread ^thread2 = gcnew Thread (gcnew ThreadStart (this, &MainWnd::taskCountDarkMode));
|
||||
thread2->Start ();
|
||||
this->adjustWhenResize ();
|
||||
}
|
||||
void eventOnPress_button1 ()
|
||||
{
|
||||
@@ -884,6 +937,21 @@ public ref class MainWnd: public Form
|
||||
setProgressTextJS (content);
|
||||
}
|
||||
}
|
||||
void adjustTextareaHeightJS ()
|
||||
{
|
||||
this->CallJSFunction ("adjustTextareaHeight", gcnew array <Object ^> {});
|
||||
}
|
||||
void invokeAdjustTextareaHeight ()
|
||||
{
|
||||
if (this->InvokeRequired)
|
||||
{
|
||||
this->Invoke (gcnew Action (this, &MainWnd::adjustTextareaHeightJS));
|
||||
}
|
||||
else
|
||||
{
|
||||
adjustTextareaHeightJS ();
|
||||
}
|
||||
}
|
||||
void setPage (int serial)
|
||||
{
|
||||
switch (serial)
|
||||
@@ -898,8 +966,10 @@ public ref class MainWnd: public Form
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
std::wstring title = m_pkgInfo.getPropertyName (), titleF = StrPrintFormatW (GetRCString_cpp (PAGE_1_TITLE).c_str (), title.c_str ());
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (titleF.c_str ()), (size_t)2);
|
||||
std::wstring title = m_pkgInfo.getPropertyName ();
|
||||
std::wstring temp = StrPrintFormatW (GetRCString_cpp (PAGE_1_TITLE).c_str (), L" ");
|
||||
std::wstring temp1 = temp + title;
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (temp1.c_str ()), (size_t)2);
|
||||
std::wstring sub = title.substr (0, title.length () - reduce) + (reduce > 3 ? L"..." : L"");
|
||||
setTextJS ("caption-title", gcnew String (StrPrintFormatW (GetRCString_cpp (PAGE_1_TITLE).c_str (), sub.c_str ()).c_str ()));
|
||||
}
|
||||
@@ -976,16 +1046,20 @@ public ref class MainWnd: public Form
|
||||
case 3:
|
||||
{
|
||||
invokeSetProgressText (rcString (PAGE_2_LOADING));
|
||||
std::wstring title = m_pkgInfo.getPropertyName (), titleF = StrPrintFormatW (GetRCString_cpp (PAGE_2_TITLE).c_str (), title.c_str ());
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (titleF.c_str ()), (size_t)2);
|
||||
std::wstring title = m_pkgInfo.getPropertyName ();
|
||||
std::wstring temp = StrPrintFormatW (GetRCString_cpp (PAGE_2_TITLE).c_str (), L" ");
|
||||
std::wstring temp1 = temp + title;
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (temp1.c_str ()), (size_t)2);
|
||||
std::wstring sub = title.substr (0, title.length () - reduce) + (reduce > 3 ? L"..." : L"");
|
||||
setTextJS ("caption-title", gcnew String (StrPrintFormatW (GetRCString_cpp (PAGE_2_TITLE).c_str (), sub.c_str ()).c_str ()));
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
std::wstring title = m_pkgInfo.getPropertyName (), titleF = StrPrintFormatW (GetRCString_cpp (PAGE_4_TITLE).c_str (), title.c_str ());
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (titleF.c_str ()), (size_t)2);
|
||||
std::wstring title = m_pkgInfo.getPropertyName ();
|
||||
std::wstring temp = StrPrintFormatW (GetRCString_cpp (PAGE_4_TITLE).c_str (), L" ");
|
||||
std::wstring temp1 = temp + title;
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (temp1.c_str ()), (size_t)2);
|
||||
std::wstring sub = title.substr (0, title.length () - reduce) + (reduce > 3 ? L"..." : L"");
|
||||
setTextJS ("caption-title", gcnew String (StrPrintFormatW (GetRCString_cpp (PAGE_4_TITLE).c_str (), sub.c_str ()).c_str ()));
|
||||
}
|
||||
@@ -1005,8 +1079,10 @@ public ref class MainWnd: public Form
|
||||
break;
|
||||
case 5:
|
||||
{
|
||||
std::wstring title = m_pkgInfo.getPropertyName (), titleF = StrPrintFormatW (GetRCString_cpp (PAGE_5_TITLE).c_str (), title.c_str ());
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (titleF.c_str ()), (size_t)2);
|
||||
std::wstring title = m_pkgInfo.getPropertyName ();
|
||||
std::wstring temp = StrPrintFormatW (GetRCString_cpp (PAGE_5_TITLE).c_str (), L" ");
|
||||
std::wstring temp1 = temp + title;
|
||||
size_t reduce = getTextOmitAdviceJS (gcnew String ("caption-title"), gcnew String (temp1.c_str ()), (size_t)2);
|
||||
std::wstring sub = title.substr (0, title.length () - reduce) + (reduce > 3 ? L"..." : L"");
|
||||
setTextJS ("caption-title", gcnew String (StrPrintFormatW (GetRCString_cpp (PAGE_5_TITLE).c_str (), sub.c_str ()).c_str ()));
|
||||
if (GetLastErrorDetailTextLength ()) setTextJS ("caption-more-info", gcnew String (GetLastErrorDetailText ()));
|
||||
@@ -1041,6 +1117,7 @@ public ref class MainWnd: public Form
|
||||
setPicBoxVisibilityJS (false);
|
||||
}
|
||||
page = serial;
|
||||
this->adjustWhenResize ();
|
||||
}
|
||||
void invokeSetPage (int page)
|
||||
{
|
||||
@@ -1169,14 +1246,28 @@ public ref class MainWnd: public Form
|
||||
if (m_silentMode)
|
||||
{
|
||||
// 在此版本中,在静默模式下打开无效的包后会自动关闭窗口结束程序。
|
||||
this->Close ();
|
||||
while (!this->IsHandleCreated) {};
|
||||
if (this->IsHandleCreated)
|
||||
{
|
||||
if (this->InvokeRequired)
|
||||
{
|
||||
this->Invoke (gcnew Action (this, &MainWnd::Close));
|
||||
}
|
||||
else
|
||||
{
|
||||
this->Close ();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
invokeSetPage (1);
|
||||
}
|
||||
}
|
||||
this->invokeSetDarkMode (IsAppInDarkMode ());
|
||||
if (this->IsHandleCreated)
|
||||
{
|
||||
this->invokeSetDarkMode (IsAppInDarkMode ());
|
||||
}
|
||||
EmptyWorkingSet ((HANDLE)-1);
|
||||
}
|
||||
void taskInstallPackage ()
|
||||
@@ -1196,10 +1287,12 @@ public ref class MainWnd: public Form
|
||||
invokeSetProgressText (rcString (PAGE_2_INSTALL));
|
||||
InstallStatus status = AddPackageFromPath (pkgPath.c_str (), &ProgressCallback);
|
||||
// MessageBeep (MB_OK);
|
||||
std::wstring title (L"");
|
||||
if (status == InstallStatus::Success)
|
||||
{
|
||||
invokeSetPage (4);
|
||||
if (m_pkgInfo.applications.size () == 1 && !m_silentMode) this->eventOnPress_button1 (); // 用于启用 APP
|
||||
title = StrPrintFormatW (GetRCString_cpp (PAGE_4_TITLE).c_str (), m_pkgInfo.getPropertyName ().c_str ());
|
||||
if (m_pkgInfo.applications.size () == 1 && !m_silentMode && this->invokeGetLaunchWhenReady ()) this->eventOnPress_button1 (); // 用于启用 APP
|
||||
Thread ^closeThread = gcnew Thread (gcnew ThreadStart (this, &MainWnd::taskCountCancel));
|
||||
closeThread->IsBackground = true;
|
||||
closeThread->Start ();
|
||||
@@ -1207,6 +1300,7 @@ public ref class MainWnd: public Form
|
||||
else
|
||||
{
|
||||
invokeSetPage (5);
|
||||
title = StrPrintFormatW (GetRCString_cpp (PAGE_5_TITLE).c_str (), m_pkgInfo.getPropertyName ().c_str ());
|
||||
if (m_silentMode)
|
||||
{
|
||||
Thread ^closeThread = gcnew Thread (gcnew ThreadStart (this, &MainWnd::taskCountCancel));
|
||||
@@ -1215,7 +1309,6 @@ public ref class MainWnd: public Form
|
||||
}
|
||||
}
|
||||
this->invokeClearTaskbarProgress ();
|
||||
std::wstring title = StrPrintFormatW (GetRCString_cpp (PAGE_4_TITLE).c_str (), m_pkgInfo.getPropertyName ().c_str ());
|
||||
std::wstring text (L"");
|
||||
if (GetLastErrorDetailTextLength ()) text += GetLastErrorDetailText ();
|
||||
bool res = CreateToastNotification (m_idenName, title.c_str (), text.c_str (), &ToastPressCallback, m_pkgInfo.getPropertyLogoIStream ());
|
||||
@@ -1325,7 +1418,8 @@ std::vector <CMDARGUMENT> cmdargs =
|
||||
{{L"", L"/", L"-"}, {L"CREATESHORTCUT", L"SHORTCUT", L"CREATELNK"}, {}, 8},
|
||||
{{L"", L"/", L"-"}, {L"DELETESHORTCUT", L"DELSHORTCUT", L"DELETELNK"}, {}, 9},
|
||||
{{L"", L"/", L"-"}, {L"DEVTOOL", L"DEVTOOLS", L"DEVMODE", L"DEVELOP"}, {}, 10},
|
||||
{{L"", L"/", L"-"}, {L"USEEPROGRAM", L"EPROGRAM", L"ESUPPORT", L"USEE"}, {}, 11}
|
||||
{{L"", L"/", L"-"}, {L"USEEPROGRAM", L"EPROGRAM", L"ESUPPORT", L"USEE"}, {}, 11},
|
||||
{{L"", L"/", L"-"}, {L"CONSOLE", L"CONSOLECLIENT"}, {}, 12},
|
||||
};
|
||||
|
||||
// 编号为大于 0 的数,失败返回非正数
|
||||
@@ -1397,9 +1491,9 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
{
|
||||
std::vector <std::wstring> vecObjSwFiles;
|
||||
bool bWin32Wnd = false, bSilent = false, bVerySilent = false,
|
||||
bUseConsole = false, bUseNewFrame = false, bDisplayHelp = false,
|
||||
bUseCmd = false, bUseNewFrame = false, bDisplayHelp = false,
|
||||
bCreateLnk = false, bDestroyLnk = false, bDevTool = false,
|
||||
bUseEProgream = false;
|
||||
bUseEProgream = false, bConsole = false;
|
||||
for (size_t cnt = 0; cnt < (size_t)argc; cnt ++)
|
||||
{
|
||||
int res = GetCmdArgSerial (argv [cnt]);
|
||||
@@ -1410,7 +1504,7 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
case 1: bUseNewFrame = false; break;
|
||||
case 2: bSilent = true; break;
|
||||
case 3: bVerySilent = true; break;
|
||||
case 4: bUseConsole = true; break;
|
||||
case 4: bUseCmd = true; break;
|
||||
case 5: bDisplayHelp = true; break;
|
||||
case 6: bUseNewFrame = true; break;
|
||||
case 7: bWin32Wnd = true; break;
|
||||
@@ -1418,6 +1512,7 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
case 9: bDestroyLnk = true; break;
|
||||
case 10: bDevTool = true; break;
|
||||
case 11: bUseEProgream = true; break;
|
||||
case 12: bConsole = true; break;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -1433,9 +1528,14 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
MessageBox::Show (
|
||||
rcString (CLHELP_1) +
|
||||
rcString (CLHELP_2) +
|
||||
rcString (CLHELP_3) +
|
||||
rcString (CLHELP_4) +
|
||||
rcString (CLHELP_5) +
|
||||
rcString (CLHELP_7)
|
||||
rcString (CLHELP_6) +
|
||||
rcString (CLHELP_7) +
|
||||
rcString (CLHELP_8) +
|
||||
rcString (CLHELP_9) +
|
||||
rcString (CLHELP_10)
|
||||
);
|
||||
return false;
|
||||
}
|
||||
@@ -1459,6 +1559,12 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
_itow (WIN_TITLE, resIdStr, 10);
|
||||
desktop.writeUIntValue (L".ShellClassInfo", L"ConfirmFileOp", 0);
|
||||
desktop.writeStringValue (L"LocalizedFileNames", L"App Installer.lnk", std::wstring (L"@") + path + L",-" + resIdStr);
|
||||
_itow (SHORTCUT_SETTINGS, resIdStr, 10);
|
||||
desktop.writeStringValue (L"LocalizedFileNames", L"Settings.lnk", std::wstring (L"@") + path + L",-" + resIdStr);
|
||||
_itow (SHORTCUT_UNINSTALL, resIdStr, 10);
|
||||
desktop.writeStringValue (L"LocalizedFileNames", L"Uninstaller.lnk", std::wstring (L"@") + path + L",-" + resIdStr);
|
||||
_itow (SHORTCUT_UPDATE, resIdStr, 10);
|
||||
desktop.writeStringValue (L"LocalizedFileNames", L"Update.lnk", std::wstring (L"@") + path + L",-" + resIdStr);
|
||||
DWORD attrs = GetFileAttributesW (desktopIni);
|
||||
SetFileAttributesW (desktopIni, attrs | FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM);
|
||||
DWORD folderAttrs = GetFileAttributesW (expandedPath);
|
||||
@@ -1501,7 +1607,7 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
else args += L"/DISABLEFRAME ";
|
||||
if (bSilent) args += L"/SILENT ";
|
||||
if (bVerySilent) args += L"/VERYSILENT ";
|
||||
if (bUseConsole) args += L"/NOGUI ";
|
||||
if (bUseCmd) args += L"/NOGUI ";
|
||||
if (bDisplayHelp) args += L"/? ";
|
||||
std::wstring cmdline = L"\"" + exepath + L"\" " + args;
|
||||
{
|
||||
@@ -1526,7 +1632,7 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
else args += L"/DISABLEFRAME ";
|
||||
if (bSilent) args += L"/SILENT ";
|
||||
if (bVerySilent) args += L"/VERYSILENT ";
|
||||
if (bUseConsole) args += L"/NOGUI ";
|
||||
if (bUseCmd) args += L"/NOGUI ";
|
||||
if (bDisplayHelp) args += L"/? ";
|
||||
std::wstring cmdline = L"\"" + exepath + L"\" " + args;
|
||||
{
|
||||
@@ -1541,7 +1647,7 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bUseConsole)
|
||||
else if (bUseCmd)
|
||||
{
|
||||
std::wstring root = EnsureTrailingSlash (GetProgramRootDirectoryW ());
|
||||
std::wstring exepath = root + L"WSAppPkgIns.exe";
|
||||
@@ -1560,6 +1666,25 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bConsole)
|
||||
{
|
||||
std::wstring root = EnsureTrailingSlash (GetProgramRootDirectoryW ());
|
||||
std::wstring exepath = root + L"AppInstallerConsole.exe";
|
||||
std::wstring args = L"";
|
||||
args += L"\"" + pkgPath + L"\" ";
|
||||
std::wstring cmdline = L"\"" + exepath + L"\" " + args;
|
||||
{
|
||||
STARTUPINFOW si = {sizeof (STARTUPINFOW)};
|
||||
PROCESS_INFORMATION pi = {0};
|
||||
if (CreateProcessW (NULL, (LPWSTR)cmdline.c_str (), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
||||
{
|
||||
WaitForSingleObject (pi.hProcess, INFINITE);
|
||||
CloseHandle (pi.hProcess);
|
||||
CloseHandle (pi.hThread);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
else if (vecObjSwFiles.size () <= 0)
|
||||
@@ -1573,7 +1698,7 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
else args += L"/DISABLEFRAME ";
|
||||
if (bSilent) args += L"/SILENT ";
|
||||
if (bVerySilent) args += L"/VERYSILENT ";
|
||||
if (bUseConsole) args += L"/NOGUI ";
|
||||
if (bUseCmd) args += L"/NOGUI ";
|
||||
if (bDisplayHelp) args += L"/? ";
|
||||
std::wstring cmdline = L"\"" + exepath + L"\" " + args;
|
||||
{
|
||||
@@ -1597,7 +1722,7 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
else args += L"/DISABLEFRAME ";
|
||||
if (bSilent) args += L"/SILENT ";
|
||||
if (bVerySilent) args += L"/VERYSILENT ";
|
||||
if (bUseConsole) args += L"/NOGUI ";
|
||||
if (bUseCmd) args += L"/NOGUI ";
|
||||
if (bDisplayHelp) args += L"/? ";
|
||||
if (bDevTool) args += L"/DEVTOOL ";
|
||||
std::wstring cmdline = L"\"" + exepath + L"\" " + args;
|
||||
@@ -1613,34 +1738,59 @@ bool ReadCommand (int argc, LPWSTR *argv)
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bUseCmd || bConsole) return false;
|
||||
else return true;
|
||||
}
|
||||
else if (vecObjSwFiles.size () > 1) // 面对多个文件
|
||||
{
|
||||
for (auto it : vecObjSwFiles)
|
||||
if (bConsole)
|
||||
{
|
||||
wchar_t path [MAX_PATH] = {0};
|
||||
if (GetModuleFileNameW (NULL, path, MAX_PATH))
|
||||
{
|
||||
std::wstring args = L"";
|
||||
args += L"\"" + it + L"\" ";
|
||||
if (bUseNewFrame) args += L"/ENABLEFRAME ";
|
||||
else args += L"/DISABLEFRAME ";
|
||||
if (bSilent) args += L"/SILENT ";
|
||||
if (bVerySilent) args += L"/VERYSILENT ";
|
||||
if (bUseConsole) args += L"/NOGUI ";
|
||||
if (bDisplayHelp) args += L"/? ";
|
||||
if (bWin32Wnd) args += L"WIN32WINDOW ";
|
||||
if (bUseEProgream) args += L"/USEEPROGRAM ";
|
||||
std::wstring cmdline = L"\"" + std::wstring (path) + L"\" " + args;
|
||||
std::wstring root = EnsureTrailingSlash (GetProgramRootDirectoryW ());
|
||||
std::wstring exepath = root + L"AppInstallerConsole.exe";
|
||||
std::wstring args = L"";
|
||||
for (auto it : vecObjSwFiles)
|
||||
{
|
||||
STARTUPINFOW si = {sizeof (STARTUPINFOW)};
|
||||
PROCESS_INFORMATION pi = {0};
|
||||
if (CreateProcessW (NULL, (LPWSTR)cmdline.c_str (), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
||||
args += L" \"" + it + L"\"";
|
||||
}
|
||||
std::wstring cmdline = L"\"" + exepath + L"\"" + args;
|
||||
{
|
||||
STARTUPINFOW si = {sizeof (STARTUPINFOW)};
|
||||
PROCESS_INFORMATION pi = {0};
|
||||
if (CreateProcessW (NULL, (LPWSTR)cmdline.c_str (), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
||||
{
|
||||
WaitForSingleObject (pi.hProcess, INFINITE);
|
||||
CloseHandle (pi.hProcess);
|
||||
CloseHandle (pi.hThread);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
for (auto it : vecObjSwFiles)
|
||||
{
|
||||
wchar_t path [MAX_PATH] = {0};
|
||||
if (GetModuleFileNameW (NULL, path, MAX_PATH))
|
||||
{
|
||||
std::wstring args = L"";
|
||||
args += L"\"" + it + L"\" ";
|
||||
if (bUseNewFrame) args += L"/ENABLEFRAME ";
|
||||
else args += L"/DISABLEFRAME ";
|
||||
if (bSilent) args += L"/SILENT ";
|
||||
if (bVerySilent) args += L"/VERYSILENT ";
|
||||
if (bUseCmd) args += L"/NOGUI ";
|
||||
if (bDisplayHelp) args += L"/? ";
|
||||
if (bWin32Wnd) args += L"WIN32WINDOW ";
|
||||
if (bUseEProgream) args += L"/USEEPROGRAM ";
|
||||
std::wstring cmdline = L"\"" + std::wstring (path) + L"\" " + args;
|
||||
{
|
||||
WaitForSingleObject (pi.hProcess, INFINITE);
|
||||
CloseHandle (pi.hProcess);
|
||||
CloseHandle (pi.hThread);
|
||||
STARTUPINFOW si = {sizeof (STARTUPINFOW)};
|
||||
PROCESS_INFORMATION pi = {0};
|
||||
if (CreateProcessW (NULL, (LPWSTR)cmdline.c_str (), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
|
||||
{
|
||||
WaitForSingleObject (pi.hProcess, INFINITE);
|
||||
CloseHandle (pi.hProcess);
|
||||
CloseHandle (pi.hThread);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1142,6 +1142,9 @@
|
||||
#define APPLIST_WINTITLE 324
|
||||
#define APPLIST_TITLE 325
|
||||
#define APPLIST_BUTTON_CANCEL 326
|
||||
#define SHORTCUT_SETTINGS 327
|
||||
#define SHORTCUT_UNINSTALL 328
|
||||
#define SHORTCUT_UPDATE 329
|
||||
#define CLHELP_1 330
|
||||
#define CLHELP_2 331
|
||||
#define CLHELP_3 332
|
||||
@@ -1149,6 +1152,9 @@
|
||||
#define CLHELP_5 334
|
||||
#define CLHELP_6 335
|
||||
#define CLHELP_7 336
|
||||
#define CLHELP_8 337
|
||||
#define CLHELP_9 338
|
||||
#define CLHELP_10 339
|
||||
#define INITWIDTH 400
|
||||
#define INITHEIGHT 401
|
||||
#define LIMITWIDTH 402
|
||||
|
||||
@@ -115,8 +115,8 @@ IDR_MANIFEST1 RT_MANIFEST "res/manifest.xml"
|
||||
//
|
||||
|
||||
IDR_VERSION_ZH_CN VERSIONINFO
|
||||
FILEVERSION 1,0,1,7
|
||||
PRODUCTVERSION 1,0,1,7
|
||||
FILEVERSION 1,0,1,9
|
||||
PRODUCTVERSION 1,0,1,9
|
||||
FILEFLAGSMASK 0x0L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -133,9 +133,9 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Bruce Winter"
|
||||
VALUE "FileDescription", "应用安装程序"
|
||||
VALUE "FileVersion", "1.0.1.7"
|
||||
VALUE "FileVersion", "1.0.1.9"
|
||||
VALUE "LegalCopyright", "\\xA9Bruce Winter. All rights reserved."
|
||||
VALUE "ProductVersion", "1.0.1.7"
|
||||
VALUE "ProductVersion", "1.0.1.9"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
@@ -145,8 +145,8 @@ BEGIN
|
||||
END
|
||||
|
||||
IDR_VERSION_EN_US VERSIONINFO
|
||||
FILEVERSION 1,0,1,7
|
||||
PRODUCTVERSION 1,0,1,7
|
||||
FILEVERSION 1,0,1,9
|
||||
PRODUCTVERSION 1,0,1,9
|
||||
FILEFLAGSMASK 0x0L
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -163,9 +163,9 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Bruce Winter"
|
||||
VALUE "FileDescription", "App Installer"
|
||||
VALUE "FileVersion", "1.0.1.7"
|
||||
VALUE "FileVersion", "1.0.1.9"
|
||||
VALUE "LegalCopyright", "\\xA9Bruce Winter. All rights reserved."
|
||||
VALUE "ProductVersion", "1.0.1.7"
|
||||
VALUE "ProductVersion", "1.0.1.9"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
||||
@@ -166,6 +166,46 @@
|
||||
<ItemGroup>
|
||||
<ClCompile Include="main.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="res\Button\Large\blank.png" />
|
||||
<Image Include="res\Button\Large\blank_light.png" />
|
||||
<Image Include="res\Button\Large\blank_press.png" />
|
||||
<Image Include="res\Button\Large\cancel_window_light.png" />
|
||||
<Image Include="res\Button\Large\cancel_window_normal.png" />
|
||||
<Image Include="res\Button\Large\cancel_window_press.png" />
|
||||
<Image Include="res\Button\Large\max_light.png" />
|
||||
<Image Include="res\Button\Large\max_normal.png" />
|
||||
<Image Include="res\Button\Large\max_press.png" />
|
||||
<Image Include="res\Button\Large\min_light.png" />
|
||||
<Image Include="res\Button\Large\min_normal.png" />
|
||||
<Image Include="res\Button\Large\min_press.png" />
|
||||
<Image Include="res\Button\Large\restore_light.png" />
|
||||
<Image Include="res\Button\Large\restore_normal.png" />
|
||||
<Image Include="res\Button\Large\restore_press.png" />
|
||||
<Image Include="res\Button\Normal\blank.png" />
|
||||
<Image Include="res\Button\Normal\blank_light.png" />
|
||||
<Image Include="res\Button\Normal\blank_press.png" />
|
||||
<Image Include="res\Button\Normal\cancel_back.png" />
|
||||
<Image Include="res\Button\Normal\cancel_light.png" />
|
||||
<Image Include="res\Button\Normal\cancel_press.png" />
|
||||
<Image Include="res\Button\Normal\max_back.png" />
|
||||
<Image Include="res\Button\Normal\max_light.png" />
|
||||
<Image Include="res\Button\Normal\max_press.png" />
|
||||
<Image Include="res\Button\Normal\min_back.png" />
|
||||
<Image Include="res\Button\Normal\min_light.png" />
|
||||
<Image Include="res\Button\Normal\min_press.png" />
|
||||
<Image Include="res\Button\Normal\restore_back.png" />
|
||||
<Image Include="res\Button\Normal\restore_light.png" />
|
||||
<Image Include="res\Button\Normal\restore_press.png" />
|
||||
<Image Include="res\Icons\FileIcon.ico" />
|
||||
<Image Include="res\Icons\IconColor.ico" />
|
||||
<Image Include="res\Icons\IconTitleBar.ico" />
|
||||
<Image Include="res\Icons\IconWhite.ico" />
|
||||
<Image Include="res\Icons\Main.ico" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Xml Include="res\manifest.xml" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
|
||||
@@ -47,4 +47,114 @@
|
||||
<Filter>源文件</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Image Include="res\Icons\Main.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Icons\FileIcon.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Icons\IconWhite.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Icons\IconColor.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\blank.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\blank_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\blank_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\min_back.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\min_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\min_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\max_back.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\max_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\max_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\restore_back.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\restore_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\restore_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\cancel_back.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\cancel_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Normal\cancel_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\blank.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\blank_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\blank_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\min_normal.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\min_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\min_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\max_normal.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\max_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\max_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\restore_normal.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\restore_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\restore_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\cancel_window_normal.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\cancel_window_light.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Button\Large\cancel_window_press.png">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
<Image Include="res\Icons\IconTitleBar.ico">
|
||||
<Filter>资源文件</Filter>
|
||||
</Image>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Xml Include="res\manifest.xml" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -516,6 +516,7 @@ void TaskInstallPackage ()
|
||||
{
|
||||
wcerr << "\rError: Install Failed. Message: Unavailable Package." << endl;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void TaskInstallPackages (size_t serial, size_t total)
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
A Windows Store App Installer for Windows 8.x.
|
||||
|
||||
Remake version: https://github.com/modernw/App-Installer-For-Windows-8.x-Reset . This version is currently in beta.
|
||||
|
||||
(Translated by ChatGTP)
|
||||
|
||||
The purpose of this project is actually to create an intuitive and visually appealing Windows Store app installer, which also serves a personal need. Unfortunately, I only have a foundation in C/C++ programming, and I am not familiar with .NET/WinRT/HTML/JavaScript/Win32API. Here, I would like to thank AI (ChatGPT, GitHub Copilot, and DeepSeek) for making this project possible when it seemed impossible. That being said, suitable tools were actually hard to find (back in the Windows 8.x era). I remember Windows App Boss, but it wasn’t specialized—it also had other features. Over such a long period, there weren’t that many tools available, and compared to today, they were difficult to find, which is quite regretful.
|
||||
|
||||
Reference in New Issue
Block a user