优化。

This commit is contained in:
unknown 2025-03-16 17:45:27 +08:00
parent 92270def83
commit 342d8939ab
4 changed files with 5 additions and 90 deletions

View File

@ -203,8 +203,7 @@ export default function () {
// "打开"菜单 // "打开"菜单
let openMenu = false; let openMenu = false;
if ( if (
(item.type === 0 && item.type === 0 ||
global.addon.hasRunas(parsePath(item.data.target))) ||
item.type === 4 || item.type === 4 ||
(item.type === 3 && item.data.target === "cmd.exe") (item.type === 3 && item.data.target === "cmd.exe")
) { ) {

View File

@ -25,8 +25,6 @@ let mainWindow: BrowserWindow | null = null;
* *
*/ */
function createMainWindow() { function createMainWindow() {
// 预热
global.addon.hasRunas(process.execPath);
// 如果窗口存在先关闭窗口 // 如果窗口存在先关闭窗口
if (mainWindow && !mainWindow.isDestroyed() && mainWindow.isVisible()) { if (mainWindow && !mainWindow.isDestroyed() && mainWindow.isVisible()) {
mainWindow.close(); mainWindow.close();

View File

@ -201,12 +201,3 @@ fn shell_execute(operation: String, file: String, params: String, start_location
fn system_item_execute(target: String, params: Option<String>) { fn system_item_execute(target: String, params: Option<String>) {
windows::system_item_execute(&target, params.as_deref()) windows::system_item_execute(&target, params.as_deref())
} }
/**
*
*/
#[allow(dead_code)]
#[napi]
fn has_runas(path: String) -> bool {
windows::has_runas(path)
}

View File

@ -42,15 +42,14 @@ use windows::{
Shell::{ Shell::{
BHID_SFUIObject, IContextMenu, IShellItem, IShellItemImageFactory, IShellLinkW, BHID_SFUIObject, IContextMenu, IShellItem, IShellItemImageFactory, IShellLinkW,
SHCreateItemFromParsingName, SHEmptyRecycleBinW, SHQueryUserNotificationState, SHCreateItemFromParsingName, SHEmptyRecycleBinW, SHQueryUserNotificationState,
ShellLink, CMF_NORMAL, CMINVOKECOMMANDINFO, GCS_VERBA, QUNS_ACCEPTS_NOTIFICATIONS, ShellLink, CMF_NORMAL, CMINVOKECOMMANDINFO, QUNS_ACCEPTS_NOTIFICATIONS, QUNS_APP,
QUNS_APP, QUNS_BUSY, QUNS_NOT_PRESENT, QUNS_PRESENTATION_MODE, QUNS_QUIET_TIME, QUNS_BUSY, QUNS_NOT_PRESENT, QUNS_PRESENTATION_MODE, QUNS_QUIET_TIME,
QUNS_RUNNING_D3D_FULL_SCREEN, SHERB_NOSOUND, SIIGBF_ICONONLY, SLGP_UNCPRIORITY, QUNS_RUNNING_D3D_FULL_SCREEN, SHERB_NOSOUND, SIIGBF_ICONONLY, SLGP_UNCPRIORITY,
}, },
WindowsAndMessaging::{ WindowsAndMessaging::{
CallNextHookEx, CreatePopupMenu, DestroyMenu, FindWindowW, GetClassNameW, CallNextHookEx, CreatePopupMenu, DestroyMenu, FindWindowW, GetClassNameW,
GetCursorPos, GetForegroundWindow, GetMenuItemCount, GetMenuItemInfoA, GetCursorPos, GetForegroundWindow, GetSystemMetrics, GetWindowRect, SendMessageW,
GetSystemMetrics, GetWindowRect, SendMessageW, SetForegroundWindow, SetForegroundWindow, SetWindowsHookExW, TrackPopupMenu, WindowFromPoint, HHOOK,
SetWindowsHookExW, TrackPopupMenu, WindowFromPoint, HHOOK, MENUITEMINFOA, MIIM_ID,
MSLLHOOKSTRUCT, SC_MONITORPOWER, SM_CXSCREEN, SM_CYSCREEN, SW_NORMAL, TPM_NONOTIFY, MSLLHOOKSTRUCT, SC_MONITORPOWER, SM_CXSCREEN, SM_CYSCREEN, SW_NORMAL, TPM_NONOTIFY,
TPM_RETURNCMD, WH_MOUSE_LL, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN, TPM_RETURNCMD, WH_MOUSE_LL, WM_LBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONDOWN,
WM_MBUTTONUP, WM_MOUSEHWHEEL, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN, WM_MBUTTONUP, WM_MOUSEHWHEEL, WM_MOUSEMOVE, WM_MOUSEWHEEL, WM_RBUTTONDOWN,
@ -722,13 +721,6 @@ pub fn shell_execute(
start_location: Option<String>, start_location: Option<String>,
) { ) {
thread::spawn(move || { thread::spawn(move || {
let mut operation = operation;
// 判断是否是runas如果是的话需要判断文件是否有以管理员身份运行的权限如果没有改为open
if operation == "runas" {
if !has_runas(file.clone()) {
operation = String::from("open");
}
}
// 是否是打开文件夹 // 是否是打开文件夹
let is_dir = operation == "explore"; let is_dir = operation == "explore";
// dir // dir
@ -812,68 +804,3 @@ pub fn system_item_execute(target: &str, params: Option<&str>) {
} }
} }
} }
/**
*
*/
pub fn has_runas(path: String) -> bool {
// IShellItem
let path = HSTRING::from(path);
if let Ok(shell_item) =
unsafe { SHCreateItemFromParsingName::<_, _, IShellItem>(PCWSTR(path.as_ptr()), None) }
{
// IContextMenu
if let Ok(context_menu) =
unsafe { shell_item.BindToHandler::<_, IContextMenu>(None, &BHID_SFUIObject) }
{
// Menu
if let Ok(menu) = unsafe { CreatePopupMenu() } {
// 写入菜单
if let Ok(()) =
unsafe { context_menu.QueryContextMenu(menu, 0, 1, 0x7FFF, CMF_NORMAL) }
{
// 获取菜单总数
let count = unsafe { GetMenuItemCount(menu) };
// 循环每一项菜单
for i in 0..count {
// 获取菜单信息
let mut menu_info = MENUITEMINFOA::default();
menu_info.cbSize = std::mem::size_of::<MENUITEMINFOA>() as u32;
menu_info.fMask = MIIM_ID;
if unsafe { GetMenuItemInfoA(menu, i as u32, true, &mut menu_info) }
.as_bool()
{
// idcmd
let idcmd = menu_info.wID as usize - 1;
// 菜单项比如在指定范围内
if idcmd >= 1 && idcmd <= 0x7FFF {
// 获取菜单命令信息
let mut verb = [0u8; 256];
let pstr = PSTR(verb.as_mut_ptr());
if let Ok(()) = unsafe {
context_menu.GetCommandString(
menu_info.wID as usize - 1,
GCS_VERBA,
None,
pstr,
verb.len() as u32,
)
} {
if let Ok(command) = unsafe { pstr.to_string() } {
if command.to_lowercase() == "runas" {
return true;
}
}
}
}
}
}
unsafe {
DestroyMenu(menu);
}
}
}
}
}
false
}