Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Обновление элементов интерфейса .dll

Ответить
Настройки темы
C/C++ - Обновление элементов интерфейса .dll

Аватара для a1ek9

Пользователь


Сообщения: 69
Благодарности: 1

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

Отправлено: 17:30, 13-12-2024

 

Deadooshka


Сообщения: 2511
Благодарности: 689

Профиль | Отправить PM | Цитировать


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"
Это сообщение посчитали полезным следующие участники:

Отправлено: 08:09, 14-12-2024 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для a1ek9

Пользователь


Сообщения: 69
Благодарности: 1

Профиль | Отправить PM | Цитировать


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

Отправлено: 12:09, 14-12-2024 | #3


Аватара для a1ek9

Пользователь


Сообщения: 69
Благодарности: 1

Профиль | Отправить PM | Цитировать


Цитата 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();
        }
    }
}

Последний раз редактировалось a1ek9, 14-12-2024 в 17:35.


Отправлено: 17:18, 14-12-2024 | #4


Deadooshka


Сообщения: 2511
Благодарности: 689

Профиль | Отправить PM | Цитировать


и короче можно, зачем классы городить
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:05, 14-12-2024 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - Обновление элементов интерфейса .dll

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Интерфейс - Изменение элементов интерфейса в 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




 
Переход