Вы должны войти, чтобы создавать сообщения и темы.

Пробую изучать C# нужна подсказка или помощ

1◄Страница 4 из 7► 7

привет yuri, 
Очень доступно и понятно пояснил в двух сообщениях. Спасибо

Ещё есть вопрос, как правильно вытянуть данные из этого кода?

Ещё есть вопрос, как правильно вытянуть данные из этого кода?

"timezone":{"id":"America\/Los_Angeles","abbr":"PST","is_dst":false,"offset":-28800,"utc":"-08:00","current_time":"2023-03-05T15:12:37-08:00"}}

например, если нужно получить: "current_time":"2023-03-05T15:12:37-08:00"   вот это значение.
Если я правильно понимаю, то эти данные инкапсулированы от значения "timezone" , я так думаю, нужно наверно указывать так: d["timezone" ["current_time"].ToString()];

ссылка на json

d["timezone"]["current_time"]

Лайкнул Aleksey
Aleksey

Всем привет
Посмотрев урок, Предотвращаем Выключение ПК, пока работает программа, появилась идея, написать программу. ТЗ такое:
через сколько выключиться компьютер, при этом потушить все процессы корректно (например: если работает Cent Browser, Potplayer  и др.), в программе есть textbox1 куда можно задать время, через сколько выключиться комп и идёт таймер отчёта через сколько комп выключиться.
Появилось несколько вопросов:
Как проверить процессы/программы которые запущены у человека на компе и которые нужно потушить? (помниться мне, что ув.Хачатур говорил, можно как-то через реестр смотреть вроде Display ветка называется) ?
Какой командой/вариантом выключить ПК ? или лучше вырубать через cmd (типа такого: Process.Start("cmd", "/c shutdown -s -f -t 00");)
Как сделать так, что бы значения которые мы пошлём в textbox1 (т.е. которые мы задаём), послать в таймер для выключения?

Привет.
Уже есть такое приложение, тык, функции расширились, выкл и перезагрузка просто, выкл/перезагрузка по таймеру, можно любое приложение закинуть с лаунчером или просто exe приложения.

Лайкнул Aleksey
Aleksey
«Любой дурак может знать. Дело в том, чтобы понять.» — Альберт Эйнштейн

Mikhail,  Приветствую,
Эта программа немного не тот функционал делает, судя по видео к программе.
В моём посте есть ссылка на форму которую, я накидал, посмотри пожалуйста, что я хочу что бы было в программе.
Но, кодом программы нужно будет ознакомиться, если он там есть, пока не смотрел, только видео глянул.

отличный пример от ув. Хачатура

// Бритва Оккама
new List<string>
{
  "notepad++",
  "Spotify",
  "Tu",
  "Photoshop",
  "Adobe Audition",
  "Skype",
  "4kvideodownloader",
  "TeamViewer",
}.ForEach(x => Process.GetProcessesByName(x).AsParallel().ForAll(y => y.Kill()));

 

привет, cmd умеет выключать компьютер с таймером, если этот способ подходит, то можно сделать батник, который будет делать запланированное выключение:
Скопированоshutdown /s /f /t x, где Скопированоx это кол-во секунд перед выключением.
Скопированоshutdown /a отменяет запланированное выключение.

Если все таки требуется тушить процессы до выключения, то придётся подумать.

Спойлер

1. Получить список процессов можно так:
Для удобства вывести их можно в listbox.

foreach (Process process in Process.GetProcesses())
    listBox1.Items.Add(process.ProcessName);

Если какие-то процессы не завершаются системой нормально, то добавляешь их в список для уничтожения.

2. Cmd самый простой и надёжный вариант, как по Мне.
3. Можно сделать так, чтобы textbox принимал чч:мм:сс, и разбивать текст через Скопировано:
Либо, например, добавить 3 кнопки: часы, минуты и секунды.
Ну, или просто сделать 3 textbox...
И вызываешь СкопированоProcess.Start("cmd", "/c shutdown -s -f -t x");, где Скопированоx это Твой конечный результат с умноженными часами и минутами в секунды.

Осталось продумать концовку:
Отображение таймера с оставшимся временем.
Завершение процессов, которые плохо завершаются системой. (за пару секунд до выключения)
И выключение.

Лайкнул Aleksey
Aleksey

yuri, привет,
Проверил команду с bat -ником Скопированоshutdown /s /f /t x действительно работает, но выдаёт дополнительный экран, где нужно нажимать кнопку закрыть.

Можно и не тушить процессы до выключения, если cmd с этой командой Скопированоshutdown /s /f /t x  будет тушить процессы/программы правильно, без лишних кнопок/окон/всплывающих подсказок/ и главное, что бы не было потом ошибок в этих программах.

Если какие-то процессы не завершаются системой нормально, то добавляешь их в список для уничтожения.

Я то не знаю, например какие процессы запущены у человека на компе, это нужно сделать как-то автоматизировано, т.е. что бы программа сама понимала, что тушить и потом выключать комп.

Cmd самый простой и надёжный вариант, как по Мне.

Согласен.

Можно сделать так, чтобы textbox принимал чч:мм:сс, и разбивать текст через :Либо, например, добавить 3 кнопки: часы, минуты и секунды.Ну, или просто сделать 3 textbox...И вызываешь Process.Start("cmd", "/c shutdown -s -f -t x");, где x это Твой конечный результат с умноженными часами и минутами в секунды.

Хочется обойтись одной кнопкой, textbox - ы можно добавить, но зачем?
Разве нельзя, например в один textbox ввести время в минутах и нажать кнопку "выполнить"?
В уроках, ув. Хачатура есть пример работы с cmd, но там пример как читать из cmd в программу lable ? если я правильно понимаю, то мне надо наоборот, что бы пользователь вводил данные в textbox , а эти данные передавались в cmd shutdown /s /f /t x   именно в этот  x, затем программа корректно тушила процессы/программы и выключался комп.

Насчет уведомления: тык.

Если Ты заведомо не знаешь, какие программы плохо завершаются, то нужно добавить возможность исключений, чтобы пользователь мог Сам добавлять программы в некий список.

Если нужно только одно значение, а не универсальное с часами, минутами и секундами, то да, можно обойтись и одним textbox. 

Дальше, например, если у Тебя только минуты, то берёшь СкопированоtextBox1.Text в перемённую и умножаешь на 60. Не забудь проработать невозможность записи букв и иных символов в textbox.

И наконец, вызываешь СкопированоProcess.Start("cmd", $"/c shutdown -s -f -t {переменная}");

Лайкнул Aleksey
Aleksey

Всем привет.
Кажись сделал программу)) но не до конца нормально работает.  Спасибо yuri, за помощь и подсказки.
Вот видео на код и работу программы. Время когда задаёшь, то чёрное окно cmd скрыл и нормально, но когда так же скрываю черное окно cmd на кнопке отмены, то окно всё равно показывается и нужно внести в окно команду Скопированоshutdown /a что бы была отмена, если пишу код со скрытием, то вообще ничего не показывается и не понятно была ли отмена команды или нет.

мой код программы

using System;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ShutdownWin
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();

            KeyPreview = true;
            KeyDown += (a, e) => { if (e.KeyValue == (char)Keys.Enter) { button1_Click(button1, null); } };


            PrivateFontCollection myfont = new PrivateFontCollection();
            using (MemoryStream fontStream = new MemoryStream(Properties.Resources.MyFont))
            {
                var data = Marshal.AllocCoTaskMem((int)fontStream.Length);
                byte[] fontdata = new byte[fontStream.Length];
                fontStream.Read(fontdata, 0, (int)fontStream.Length);
                Marshal.Copy(fontdata, 0, data, (int)fontStream.Length);
                myfont.AddMemoryFont(data, (int)fontStream.Length);
                Marshal.FreeCoTaskMem(data);
            }

            Font = new Font(myfont.Families[0], Font.Size);
            Controls.OfType<Control>().Where(x => x.GetType().GetProperty("UseCompatibleTextRendering") != null)
                .ToList().ForEach(x => x.GetType().GetProperty("UseCompatibleTextRendering").SetValue(x, true));
        }

        void button1_Click(object sender, EventArgs e)
        {
            string min = textBox1.Text;
            int result = Convert.ToInt32(min) * 60;
            // UseShellExecute = false;
            // CreateNoWindow = true;
            // Process.Start("cmd", $"/c shutdown -s -f -t {result}");
            Process process = Process.Start(new ProcessStartInfo
            {
                FileName = "cmd",
                Arguments = $"/c shutdown -s -f -t {result}",
                UseShellExecute = false,
                CreateNoWindow = true,
                RedirectStandardOutput = true
            });
        }

        void timer1_Tick(object sender, EventArgs e)
        {
            string date_time = DateTime.Now.ToString();
            label2.Text = date_time;
        }

        void button2_Click(object sender, EventArgs e)
        {
            // shutdown -s -t 3600 -c " "
            // shutdown /a
             Process.Start("cmd", $"shutdown -a");
         //   Process process2 = Process.Start(new ProcessStartInfo
         //   {
         //       FileName = "cmd",
         //       Arguments = "shutdown -s -t 3600 -c \" \"",
         //       UseShellExecute = false,
         //       CreateNoWindow = true,
         //       RedirectStandardOutput = true
         //   });
        }
    }
}

 


Хочется, что бы черных окон cmd вообще не было при запуске/отмене, но в правом нижнем углу уведомления, что бы были на отмену/запуск.  Как это сделать?

Наконец-то, запилил ещё программу которая выключает комп по заданному времени в минутах. (теперь работает как надо)
Исходники программы тут, демонстрация программы тут и 

код программы тут

using System;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Text;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using System.Windows.Forms;

namespace ShutdownWin
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();

            KeyPreview = true;
            KeyDown += (a, e) => { if (e.KeyValue == (char)Keys.Enter) { button1_Click(button1, null); } };


            PrivateFontCollection myfont = new PrivateFontCollection();
            using (MemoryStream fontStream = new MemoryStream(Properties.Resources.MyFont))
            {
                var data = Marshal.AllocCoTaskMem((int)fontStream.Length);
                byte[] fontdata = new byte[fontStream.Length];
                fontStream.Read(fontdata, 0, (int)fontStream.Length);
                Marshal.Copy(fontdata, 0, data, (int)fontStream.Length);
                myfont.AddMemoryFont(data, (int)fontStream.Length);
                Marshal.FreeCoTaskMem(data);
            }

            Font = new Font(myfont.Families[0], 14);
            Controls.OfType<Control>().Where(x => x.GetType().GetProperty("UseCompatibleTextRendering") != null)
                .ToList().ForEach(x => x.GetType().GetProperty("UseCompatibleTextRendering").SetValue(x, true));
        }
        void button1_Click(object sender, EventArgs e)
        {
            string min = textBox1.Text;
            int result = Convert.ToInt32(min) * 60;

            Process process = Process.Start(new ProcessStartInfo
            {
                FileName = "cmd",
                Arguments = $"/c shutdown -s -f -t {result}",
                UseShellExecute = false,
                CreateNoWindow = true
            });
        }
        void timer1_Tick(object sender, EventArgs e)
        {
            string date_time = DateTime.Now.ToString();
            label2.Text = date_time;
        }
        void button2_Click(object sender, EventArgs e)
        {
            // shutdown -s -t 3600 -c " "  отключение ПК без уведомления           
            Process process2 = Process.Start(new ProcessStartInfo
            {
                FileName = "cmd",
                Arguments = "/c shutdown -a",
                UseShellExecute = false,
                CreateNoWindow = true,
            });
        }
        void textBox1_Click(object sender, EventArgs e)
        {
            textBox1.Text = "";
        }
        void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (Regex.IsMatch(textBox1.Text, "[a-zA-Z, а-яА-я .]"))
            {
                MessageBox.Show("Вводить нужно только цифры", Text, MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
                textBox1.Text = textBox1.Text.Remove(textBox1.Text.Length - 1);
                textBox1.SelectionStart = textBox1.SelectionLength;
            }
        }
    }
}

 

И всё равно в конце выскакивает окно сообщения, или когда задаёшь время 1 мин, то тоже показывает окно
Всем спасибо, кто помогал и принимал участие, кто заходит на эту страницу, для совета/помощи.

P.S.  ещё понравилась программа выключения компа на Githab

Привет, рекомендую сменить проверку цифр на такую: СкопированоRegex.IsMatch(textBox1.Text, @"[^\d]+")
Потому что в Твоем textBox можно вводить символы ($#) и программа рухнет при попытке конвертации в цифорки

Также, рекомендую не копипастить код, а просто сделать метод cmd:

Process cmd(string command) => Process.Start(new ProcessStartInfo {
    FileName = "cmd",
    Arguments = $"/c {command}",
    UseShellExecute = false,
    CreateNoWindow = true,
});

И дальше просто вызываешь cmd("shutdown /a")

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

привет yuri, 

Regex.IsMatch(textBox1.Text, @"[^\d]+")

сделал так 💪
а вот по поводу метода есть вопрос, справедливо сделать метод один, но у меня есть переменная result , не могу понять как вызвать один метод с ней а второй без, смешно конечно, но что-то туплю. 😤

примерно так понимаю себе код

void cmd(string command)
        {
            string min = textBox1.Text;
            int result = Convert.ToInt32(min) * 60;

            Process process = Process.Start(new ProcessStartInfo
            {
                FileName = "cmd",
                Arguments = $"/c {command} {result}",  // но вот что делать с {result} если метод один ?
                UseShellExecute = false,
                CreateNoWindow = true
            });
        }
void button1_Click(object sender, EventArgs e)
        {
            cmd("shutdown -s -f -t")   // тут должна быть такая команда  Arguments = $"/c shutdown -s -f -t {result}"
        }
void button2_Click(object sender, EventArgs e)
        {
            cmd("shutdown -a")  //  а тут должна быть такая команда  Arguments = "/c shutdown -a"
        }

 

Точно также как и ранее, только без /c
Скопировано$"shutdown -s -f -t {result}"

Я Тебе кинул готовый метод, а Ты туда добавил конвертацию результата, что в случае отмены не нужен)

Спойлер

                    void button1_Click(object sender, EventArgs e) {
                        string min = textBox1.Text; 
                        int result = Convert.ToInt32(min) * 60; 
                        
                        cmd($"shutdown -s -f -t {result}") 
                            
                    }


Process cmd(string command) => Process.Start(new ProcessStartInfo {
    FileName = "cmd",
    Arguments = $"/c {command}",
    UseShellExecute = false,
    CreateNoWindow = true,
});

 

Лайкнули Aleksey и Pixi
AlekseyPixi
1◄Страница 4 из 7► 7