|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Обновление элементов интерфейса .dll |
|
C/C++ - Обновление элементов интерфейса .dll
|
Пользователь Сообщения: 69 |
Профиль | Отправить PM | Цитировать Добрый вечер! Пишу небольшой проект в 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(); |
|
Отправлено: 17:30, 13-12-2024 |
Deadooshka Сообщения: 2511
|
Профиль | Отправить PM | Цитировать https://godbolt.org/z/coK4veEz6
если .net установлен, то компилятор там есть (примерно c:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe или в папке Framework64, если система 64-битная) |
Отправлено: 08:09, 14-12-2024 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Пользователь Сообщения: 69
|
Профиль | Отправить PM | Цитировать Цитата Sham:
|
|
Отправлено: 12:09, 14-12-2024 | #3 |
Пользователь Сообщения: 69
|
Профиль | Отправить PM | Цитировать Цитата a1ek9:
Не подскажешь еще момент, убрал лишнее с скрипта 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() поля или методы). 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(); } } } |
|
Последний раз редактировалось a1ek9, 14-12-2024 в 17:35. Отправлено: 17:18, 14-12-2024 | #4 |
Deadooshka Сообщения: 2511
|
Профиль | Отправить PM | Цитировать и короче можно, зачем классы городить
|
|
Отправлено: 19:05, 14-12-2024 | #5 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Интерфейс - Изменение элементов интерфейса в Windows 7 | MilesEdgeworth07 | Microsoft Windows 7 | 0 | 16-07-2021 10:55 | |
Интерфейс - [решено] Размер элементов интерфейса/кнопки управления окном | pandarianin | Microsoft Windows 8 и 8.1 | 2 | 15-06-2016 03:04 | |
Помогите сбить перехватчиков c user32.dll, advapi32.dll, netapi.dll | Pr0ga | Лечение систем от вредоносных программ | 3 | 26-06-2010 18:06 | |
Ошибка - точка входа в процедуру не найдена в библиотеке DLL Core.dll | Finch000 | Microsoft Windows 2000/XP | 7 | 07-09-2009 04:03 | |
Разное - [решено] dwmapi.dll; mpr.dll; shlwapi.dll | Reset5 | Microsoft Windows 2000/XP | 2 | 14-06-2008 16:31 |
|