Войти

Показать полную графическую версию : [решено] Обновление элементов интерфейса .dll


a1ek9
13-12-2024, 17:30
Добрый вечер! Пишу небольшой проект в 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 та лагает). У кого есть время гляньте пожалуйста)

Sham
14-12-2024, 08:09
https://godbolt.org/z/coK4veEz6
если .net установлен, то компилятор там есть (примерно c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe или в папке Framework64, если система 64-битная)
csc.exe /nologo /o /t:exe /out:"файл.exe" "исходный_код.cs"

a1ek9
14-12-2024, 12:09
если .net установлен, то компилятор там есть (примерно c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe или в папке Framework64, если система 64-битная) »
От души тебе друг! Прям вообще бомба, то что надо)

a1ek9
14-12-2024, 17:18
У меня ноутбук не выдержит ставить компиляторы »
В послдений раз лет 10 назад пользовался borland, но тогда и компьютер хороший был)
Не подскажешь еще момент, убрал лишнее с скрипта PS, теперь компиляция завершается неудачей.
$UpdateEnvExplorerAPI = @{
Namespace = "WinAPI";
Name = "UpdateEnvExplorer";
Language = "CSharp";
MemberDefinition = @"
private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);
private const int WM_SETTINGCHANGE = 0x1a;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);
public static void Refresh()
{
SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, "TraySettings");
}
"@
}
IF (-not ("WinAPI.UpdateEnvExplorer" -as [type]))
{
Add-Type @UpdateEnvExplorerAPI
}
[WinAPI.UpdateEnvExplorer]::Refresh()

PS отрабатывает код на ура без каких либо ошибок. А в c# не хочет, пишет (error CS0116: Пространство имен не может напрямую включать в себя такие члены, как
поля или методы).
p.s. Исправил, вот как надо было
// Framework: .NET

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;

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, IntPtr wParam, string lParam);

public static void Refresh()
{
SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, "TraySettings");
}
}

class Program
{
static void Main()
{
if (Type.GetType("WinAPI.UpdateEnvExplorer") == null)
{
// Type not found, handle accordingly if needed.
}
UpdateEnvExplorer.Refresh();
}
}
}

Sham
14-12-2024, 19:05
и короче (https://sharplab.io/#v2:EYLgHgbALANALiAbgUwE4EsBmBPAPgAQCYBGAWACh8AGAAn2IDoAlAVwDs50BbZBgSQ5oA9gAcAymkToAxsgDOAbgrLKAZjr EIdQjQCqIgCYBDOMgCibRGbAiANkNRoKAbwoBIERkQnkGrY6MDITZbbBoBOAAFOFQaAAkAdQA5ABEAfQAhJgB5AEEUgGFcsQAVGg BeGjZkAHdwjmjUAAoqMEx2zABKJXIPLx8aaWC5OBp0DhoEgFk0sTMSkr4kgHECuNyVswqaVuIjHvcAbRTbWz4uEQc4JoAiFjk0VU IGA1ObmBoCgAsjVAlRyrfX7/Bi5FhwIQff4AGSMIzMqFQDm2mCMtgenQAuu56FpkGBTKg2DRgEIhLYaBI2AYkkJODgpvI5EYAObIJoRRo0L4JakfFjjUZTOQsj6c mI0GqRX5GLgfei0WzS1Cy7oqNxEQgUGg6miuci6w2U5DU2n07CMuTMtlNRKpTI5fJFUofaazeaLFZrDbLMxihoxBgALWEHxuJRV2 H+nDYLLkNzVvQAvhQk0A) можно, зачем классы городить




© OSzone.net 2001-2012