const fs = require("fs"); const path = require("path"); const { getQuickcommandFolderFile } = require("./getQuickcommandFile"); const getQuickcommandIconPath = () => { try { const iconPath = getQuickcommandFolderFile("logo", "png"); if (!fs.existsSync(iconPath)) { fs.copyFileSync(path.join(__dirname, "..", "logo.png"), iconPath); } return iconPath; } catch (error) { console.error(error); return null; } }; const showSystemMessageBox = async function (content, title = "") { const iconPath = getQuickcommandIconPath(); if (window.utools.isMacOs()) { let iconParam = "note"; if (iconPath) { const posixPath = iconPath.replace(/\\/g, "/"); iconParam = `alias POSIX file "${posixPath}"`; } const script = `display dialog "${content}" with title "${title}" buttons {"确定"} default button "确定" with icon ${iconParam}`; await this.runAppleScript(script); } else if (window.utools.isWindows()) { const csharpScript = ` using System.Windows.Forms; using System.Drawing; using System.IO; class Program { static void Main() { Form form = new Form(); ${ iconPath ? `using (var bmp = new Bitmap("${iconPath}")) { form.Icon = Icon.FromHandle(bmp.GetHicon()); }` : "" } MessageBox.Show(form, "${content}", "${title}", MessageBoxButtons.OK, MessageBoxIcon.Information); form.Dispose(); } }`; await this.runCsharp(csharpScript); } }; // 系统级输入框 const showSystemInputBox = async function (placeholders, title = "") { if (!Array.isArray(placeholders)) { placeholders = [placeholders]; } const iconPath = getQuickcommandIconPath(); if (window.utools.isMacOs()) { let iconParam = "note"; if (iconPath) { const posixPath = iconPath.replace(/\\/g, "/"); iconParam = `alias POSIX file "${posixPath}"`; } const results = []; for (let i = 0; i < placeholders.length; i++) { const isLast = i === placeholders.length - 1; const buttons = isLast ? '{"取消", "确定"}' : '{"取消", "继续"}'; const defaultButton = isLast ? '"确定"' : '"继续"'; const script = `display dialog "${placeholders[i]}" with title "${title}" default answer "" buttons ${buttons} default button ${defaultButton} with icon ${iconParam}`; const result = await this.runAppleScript(script); const buttonClicked = isLast ? "确定" : "继续"; if (!result.includes(`button returned:${buttonClicked}`)) { return null; } const text = result.match(/text returned:(.+)/)[1]; results.push(text); } return results; } else if (window.utools.isWindows()) { const csharpScript = ` using System.Windows.Forms; using System.Drawing; using System.IO; class Program { static void Main() { Form form = new Form(); form.Text = "${title}"; form.ClientSize = new Size(300, ${50 + placeholders.length * 70}); form.FormBorderStyle = FormBorderStyle.FixedDialog; form.StartPosition = FormStartPosition.CenterScreen; form.MaximizeBox = false; form.MinimizeBox = false; ${ iconPath ? `using (var bmp = new Bitmap("${iconPath}")) { form.Icon = Icon.FromHandle(bmp.GetHicon()); }` : "" } ${placeholders .map( (placeholder, index) => ` Label label${index} = new Label(); label${index}.Text = "${placeholder}"; label${index}.SetBounds(10, ${10 + index * 70}, 280, 20); form.Controls.Add(label${index}); TextBox textBox${index} = new TextBox(); textBox${index}.SetBounds(10, ${35 + index * 70}, 280, 20); form.Controls.Add(textBox${index});` ) .join("\n")} Button okButton = new Button(); okButton.Text = "确定"; okButton.DialogResult = DialogResult.OK; okButton.SetBounds(120, ${20 + placeholders.length * 70}, 75, 23); form.Controls.Add(okButton); Button cancelButton = new Button(); cancelButton.Text = "取消"; cancelButton.DialogResult = DialogResult.Cancel; cancelButton.SetBounds(210, ${ 20 + placeholders.length * 70 }, 75, 23); form.Controls.Add(cancelButton); form.AcceptButton = okButton; form.CancelButton = cancelButton; if (form.ShowDialog() == DialogResult.OK) { ${placeholders .map((_, index) => `Console.WriteLine(textBox${index}.Text);`) .join("\n ")} } form.Dispose(); } }`; const result = await this.runCsharp(csharpScript); const lines = result.trim().split("\n"); return lines.length > 0 && lines[0] !== "" ? lines : null; } }; // 系统级确认框 const showSystemConfirmBox = async function (content, title = "") { const iconPath = getQuickcommandIconPath(); if (window.utools.isMacOs()) { let iconParam = "note"; if (iconPath) { const posixPath = iconPath.replace(/\\/g, "/"); iconParam = `alias POSIX file "${posixPath}"`; } const script = `display dialog "${content}" with title "${title}" buttons {"取消", "确定"} default button "确定" with icon ${iconParam}`; const result = await this.runAppleScript(script); return result.includes("button returned:确定"); } else if (window.utools.isWindows()) { const csharpScript = ` using System.Windows.Forms; using System.Drawing; using System.IO; class Program { static void Main() { Form form = new Form(); ${ iconPath ? `using (var bmp = new Bitmap("${iconPath}")) { form.Icon = Icon.FromHandle(bmp.GetHicon()); }` : "" } DialogResult result = MessageBox.Show(form, "${content}", "${title}", MessageBoxButtons.OKCancel, MessageBoxIcon.Question); Console.WriteLine(result == DialogResult.OK); form.Dispose(); } }`; const result = await this.runCsharp(csharpScript); return result.trim() === "True"; } }; // 系统级选择框 const showSystemSelectList = async function (items, title = "") { const iconPath = getQuickcommandIconPath(); if (window.utools.isMacOs()) { const itemList = items.map((item) => `"${item}"`).join(", "); const script = `choose from list {${itemList}} with title "${title}" with prompt "请选择:" default items {"${items[0]}"}`; const result = await this.runAppleScript(script); if (result.includes("false")) return null; const text = result.trim(); const id = items.findIndex((item) => item === text); return { id, text }; } else if (window.utools.isWindows()) { const csharpScript = ` using System.Windows.Forms; using System.Drawing; using System.IO; class Program { static void Main() { Form form = new Form(); ListBox listBox = new ListBox(); Button okButton = new Button(); Button cancelButton = new Button(); form.Text = "${title}"; form.ClientSize = new Size(300, 250); form.FormBorderStyle = FormBorderStyle.FixedDialog; form.StartPosition = FormStartPosition.CenterScreen; form.MaximizeBox = false; form.MinimizeBox = false; ${ iconPath ? `using (var bmp = new Bitmap("${iconPath}")) { form.Icon = Icon.FromHandle(bmp.GetHicon()); }` : "" } listBox.SetBounds(10, 10, 280, 180); ${items .map((item, index) => `listBox.Items.Add("${item}");`) .join("\n ")} listBox.SelectedIndex = 0; form.Controls.Add(listBox); okButton.Text = "确定"; okButton.DialogResult = DialogResult.OK; okButton.SetBounds(120, 200, 75, 23); form.Controls.Add(okButton); cancelButton.Text = "取消"; cancelButton.DialogResult = DialogResult.Cancel; cancelButton.SetBounds(210, 200, 75, 23); form.Controls.Add(cancelButton); if (form.ShowDialog() == DialogResult.OK && listBox.SelectedItem != null) { Console.WriteLine($"{listBox.SelectedIndex}|{listBox.SelectedItem}"); } form.Dispose(); } }`; const result = await this.runCsharp(csharpScript); if (result.trim()) { const [id, text] = result.trim().split("|"); return { id: parseInt(id), text }; } return null; } }; // 系统级按钮组弹窗 const showSystemButtonBox = async function (buttons, content, title = "") { const iconPath = getQuickcommandIconPath(); if (window.utools.isMacOs()) { let iconParam = "note"; if (iconPath) { const posixPath = iconPath.replace(/\\/g, "/"); iconParam = `alias POSIX file "${posixPath}"`; } const buttonList = buttons.map((btn) => `"${btn}"`).join(", "); const script = `display dialog "${content}" with title "${title}" buttons {${buttonList}} default button "${buttons[0]}" with icon ${iconParam}`; const result = await this.runAppleScript(script); const match = result.match(/button returned:(.+)/); if (match) { const text = match[1]; const id = buttons.findIndex((btn) => btn === text); return { id, text }; } return null; } else if (window.utools.isWindows()) { const csharpScript = ` using System.Windows.Forms; using System.Drawing; using System.IO; class Program { static void Main() { Form form = new Form(); Label label = new Label(); FlowLayoutPanel buttonPanel = new FlowLayoutPanel(); form.Text = "${title}"; form.ClientSize = new Size(400, 150); form.FormBorderStyle = FormBorderStyle.FixedDialog; form.StartPosition = FormStartPosition.CenterScreen; form.MaximizeBox = false; form.MinimizeBox = false; ${ iconPath ? `using (var bmp = new Bitmap("${iconPath}")) { form.Icon = Icon.FromHandle(bmp.GetHicon()); }` : "" } label.Text = "${content}"; label.SetBounds(10, 10, 380, 40); label.AutoSize = true; form.Controls.Add(label); buttonPanel.SetBounds(10, 60, 380, 40); buttonPanel.FlowDirection = FlowDirection.RightToLeft; buttonPanel.WrapContents = false; form.Controls.Add(buttonPanel); ${buttons .map( (btn, index) => ` Button button${index} = new Button(); button${index}.Text = "${btn}"; button${index}.DialogResult = DialogResult.OK; button${index}.Tag = "${index}"; button${index}.SetBounds(0, 0, 80, 30); buttonPanel.Controls.Add(button${index});` ) .join("\n")} DialogResult result = form.ShowDialog(); if (result == DialogResult.OK) { foreach (Button btn in buttonPanel.Controls) { if (btn.DialogResult == result) { Console.WriteLine($"{btn.Tag}|{btn.Text}"); break; } } } form.Dispose(); } }`; const result = await this.runCsharp(csharpScript); if (result.trim()) { const [id, text] = result.trim().split("|"); return { id: parseInt(id), text }; } return null; } }; // 系统级文本区域弹窗 const showSystemTextArea = async function ( placeholder = "", defaultText = "", title = "" ) { const iconPath = getQuickcommandIconPath(); if (window.utools.isWindows()) { const csharpScript = ` using System.Windows.Forms; using System.Drawing; using System.IO; class Program { static void Main() { Form form = new Form(); TextBox textBox = new TextBox(); Button okButton = new Button(); Button cancelButton = new Button(); Label label = new Label(); form.Text = "${title}"; form.ClientSize = new Size(400, 300); form.FormBorderStyle = FormBorderStyle.FixedDialog; form.StartPosition = FormStartPosition.CenterScreen; form.MaximizeBox = false; form.MinimizeBox = false; ${ iconPath ? `using (var bmp = new Bitmap("${iconPath}")) { form.Icon = Icon.FromHandle(bmp.GetHicon()); }` : "" } label.Text = "${placeholder}"; label.SetBounds(10, 10, 380, 20); form.Controls.Add(label); textBox.Multiline = true; textBox.ScrollBars = ScrollBars.Vertical; textBox.SetBounds(10, 40, 380, 180); textBox.Text = "${defaultText}"; form.Controls.Add(textBox); okButton.Text = "确定"; okButton.DialogResult = DialogResult.OK; okButton.SetBounds(220, 230, 75, 23); form.Controls.Add(okButton); cancelButton.Text = "取消"; cancelButton.DialogResult = DialogResult.Cancel; cancelButton.SetBounds(310, 230, 75, 23); form.Controls.Add(cancelButton); form.AcceptButton = okButton; form.CancelButton = cancelButton; if (form.ShowDialog() == DialogResult.OK) { Console.WriteLine(textBox.Text); } form.Dispose(); } }`; const result = await this.runCsharp(csharpScript); return result.trim() || null; } }; module.exports = { showSystemMessageBox, showSystemInputBox, showSystemConfirmBox, showSystemSelectList, showSystemButtonBox, showSystemTextArea, };