Как определить размер памяти видеокарты?
Цитата: Komoliddin от 18.04.2021, 21:36Всем доброго времени суток!
Как определить размер памяти видеокарты?
Через Win32_VideoController больше 4GB не показывает
Всем доброго времени суток!
Как определить размер памяти видеокарты?
Через Win32_VideoController больше 4GB не показывает
Цитата: BigGreenElpy от 18.04.2021, 23:30Приветствую, вот тут есть путь в реестре к нужной ветке, отвечающей за информацию о видеокарте. Там есть параметр
HardwareInformation.qwMemorySize, который хранит в шестнадцатеричном виде информацию об объёме видеопамяти твой карты. Считывай его, переводи в десятичную и дели два раза на 1024 - получишь значение в мегабайтах, поделив ещ раз на 1024 - получишь Гигабайты
Приветствую, вот тут есть путь в реестре к нужной ветке, отвечающей за информацию о видеокарте. Там есть параметр СкопированоHardwareInformation.qwMemorySize, который хранит в шестнадцатеричном виде информацию об объёме видеопамяти твой карты. Считывай его, переводи в десятичную и дели два раза на 1024 - получишь значение в мегабайтах, поделив ещ раз на 1024 - получишь Гигабайты
Цитата: Komoliddin от 19.04.2021, 08:03Спасибо
Сделал так:using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000", true)) { string gpuram = key?.GetValue("HardwareInformation.qwMemorySize")?.ToString(); int intgpuram; intgpuram = int.Parse(gpuram); label1.Text = (intgpuram / 1024 / 1024 / 1024 + " GB"); }Запускаю где 1GB память работает,
Запускаю где 8GB память не запускается
System.OverflowException: "Значение было недопустимо малым или недопустимо большим для Int32."
как решать?
Спасибо
Сделал так:
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000", true))
{
string gpuram = key?.GetValue("HardwareInformation.qwMemorySize")?.ToString();
int intgpuram;
intgpuram = int.Parse(gpuram);
label1.Text = (intgpuram / 1024 / 1024 / 1024 + " GB");
}
Запускаю где 1GB память работает,
Запускаю где 8GB память не запускается
System.OverflowException: "Значение было недопустимо малым или недопустимо большим для Int32."
как решать?
Цитата: Adler от 19.04.2021, 09:23Цитата: Komoliddin от 19.04.2021, 08:03System.OverflowException: "Значение было недопустимо малым или недопустимо большим для Int32."
как решать?Добрый день.
Блин, когда же вы уже сами научитесь думать самостоятельно, своей головой? У вас же в тексте сообщения об ошибке все написано, читайте. Это мысли вслух, отвечать не надо...
Максимальное значение, допустимое для Int32 он же int - 2147483647. Для того, что бы использовать числа больше этого, необходимо использовать Int64, он же long.
P.S. Правильнее и лаконичнее это сделать так:label1.Text = (UInt64.Parse(key?.GetValue("HardwareInformation.qwMemorySize")?.ToString()) / Math.Pow(1024,3) + " GB");В вашем варианте (
/ 1024 / 1024 / 1024), если будет, например, дробный объем памяти (0.5 G, например, на какой-нибудь старой видеокарте), у вас выдаст 0Gb, т.к. будет производиться деление целочисленных значений, а при использованииMath.Powбудет обработка чисел с плавающей запятой (double).Есть еще другой аспект - ветка
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000\доступна только для администратора, т.е. при включенном UAC и запуске программы без прав администратора получите исключениеSystem.Security.SecurityException: Запрошенный доступ к реестру запрещен.
Цитата: Komoliddin от 19.04.2021, 08:03System.OverflowException: "Значение было недопустимо малым или недопустимо большим для Int32."
как решать?
Добрый день.
Блин, когда же вы уже сами научитесь думать самостоятельно, своей головой? У вас же в тексте сообщения об ошибке все написано, читайте. Это мысли вслух, отвечать не надо...
Максимальное значение, допустимое для Int32 он же int - 2147483647. Для того, что бы использовать числа больше этого, необходимо использовать Int64, он же long.
P.S. Правильнее и лаконичнее это сделать так:
label1.Text = (UInt64.Parse(key?.GetValue("HardwareInformation.qwMemorySize")?.ToString()) / Math.Pow(1024,3) + " GB");
В вашем варианте (Скопировано / 1024 / 1024 / 1024), если будет, например, дробный объем памяти (0.5 G, например, на какой-нибудь старой видеокарте), у вас выдаст 0Gb, т.к. будет производиться деление целочисленных значений, а при использовании СкопированоMath.Pow будет обработка чисел с плавающей запятой (double).
Есть еще другой аспект - ветка СкопированоHKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000\ доступна только для администратора, т.е. при включенном UAC и запуске программы без прав администратора получите исключение СкопированоSystem.Security.SecurityException: Запрошенный доступ к реестру запрещен.
Цитата: Komoliddin от 19.04.2021, 10:17Цитата: Adler от 19.04.2021, 09:23label1.Text = (UInt64.Parse(key?.GetValue("HardwareInformation.qwMemorySize")?.ToString()) / Math.Pow(1024,3) + " GB");
Спасибо все работает!
А путь к память всегда будет так, или везде разный?
"SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000"
Цитата: Adler от 19.04.2021, 09:23label1.Text = (UInt64.Parse(key?.GetValue("HardwareInformation.qwMemorySize")?.ToString()) / Math.Pow(1024,3) + " GB");
Скопировано
Спасибо все работает!
А путь к память всегда будет так, или везде разный?
"SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000"
Цитата: Adler от 19.04.2021, 10:45Это документированный Microsoft класс. Тут вопрос скорее всего в другом, как это будет работать когда в системе две видеокарты (встроенная и дискретная).
Это документированный Microsoft класс. Тут вопрос скорее всего в другом, как это будет работать когда в системе две видеокарты (встроенная и дискретная).