Обновление элементов интерфейса .dll
Добрый вечер! Пишу небольшой проект в ams (lua), у меня есть настройки которые только после перезапуска проводника, меню пуск, dwm применяются. Нашел интересный скрипт на powershell. Но на более менее старых компьютерах и ноутбуков выполняется до 10сек и больше. В AMS есть возможность подключить по запросу dll и вызвать функцию. Не поможете собрать на C#, C++ данный скрипт? Пользовался онлайн компиляторами, из 30 два наверное смогли без ошибок собрать, но чтобы скачать там начинается, премиум и т.п. Вот скрипт на ps:
Код:
# Restart Start menu
# Перезапустить меню "Пуск"
Stop-Process -Name StartMenuExperienceHost -Force
# Refresh desktop icons, environment variables and taskbar without restarting File Explorer
# Обновить иконки рабочего стола, переменные среды и панель задач без перезапуска "Проводника"
$UpdateEnvExplorerAPI = @{
Namespace = "WinAPI"
Name = "UpdateEnvExplorer"
Language = "CSharp"
MemberDefinition = @"
private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);
private const int WM_SETTINGCHANGE = 0x1a;
private const int SMTO_ABORTIFHUNG = 0x0002;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern IntPtr SendMessageTimeout(IntPtr hWnd, int Msg, IntPtr wParam, string lParam, int fuFlags, int uTimeout, IntPtr lpdwResult);
[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
public static void Refresh()
{
// Update desktop icons
SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
// Update environment variables
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 100, IntPtr.Zero);
// Update taskbar
SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, "TraySettings");
}
"@
}
IF (-not ("WinAPI.UpdateEnvExplorer" -as [type]))
{
Add-Type @UpdateEnvExplorerAPI
}
[WinAPI.UpdateEnvExplorer]::Refresh()
А вот что конвертер выдал:
Код:
// Framework: .NET Framework
// Technology Stack: WinAPI
// Restart Start menu
// Перезапустить меню "Пуск"
System.Diagnostics.Process.Start("taskkill", "/F /IM StartMenuExperienceHost.exe");
// Refresh desktop icons, environment variables and taskbar without restarting File Explorer
// Обновить иконки рабочего стола, переменные среды и панель задач без перезапуска "Проводника"
using System;
using System.Runtime.InteropServices;
namespace WinAPI
{
public static class UpdateEnvExplorer
{
private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);
private const int WM_SETTINGCHANGE = 0x1a;
private const int SMTO_ABORTIFHUNG = 0x0002;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern IntPtr SendMessageTimeout(IntPtr hWnd, int Msg, IntPtr wParam, string lParam, int fuFlags, int uTimeout, IntPtr lpdwResult);
[DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = false)]
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
public static void Refresh()
{
// Update desktop icons
SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
// Update environment variables
SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 100, IntPtr.Zero);
// Update taskbar
SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, "TraySettings");
}
}
}
// Call the Refresh method to perform the updates
WinAPI.UpdateEnvExplorer.Refresh();
У меня ноутбук не выдержит ставить компиляторы (с ams та лагает). У кого есть время гляньте пожалуйста)
|