Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Обновление элементов интерфейса .dll (http://forum.oszone.net/showthread.php?t=355966)

a1ek9 13-12-2024 17:30 3034136

Обновление элементов интерфейса .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 та лагает). У кого есть время гляньте пожалуйста)

Sham 14-12-2024 08:09 3034146

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 3034149

Цитата:

Цитата Sham
если .net установлен, то компилятор там есть (примерно c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe или в папке Framework64, если система 64-битная) »

От души тебе друг! Прям вообще бомба, то что надо)

a1ek9 14-12-2024 17:18 3034154

Цитата:

Цитата a1ek9
У меня ноутбук не выдержит ставить компиляторы »

В послдений раз лет 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 3034156

и короче можно, зачем классы городить


Время: 23:55.

Время: 23:55.
© OSzone.net 2001-