Ответы пользователя по тегу C#
  • Как выключить Ctrl+C, Alt F4 и прочие кнопки закрытия КОНСОЛИ?

    twobomb
    @twobomb
    Console.CancelKeyPress += (sender, args) =>
                {
                    args.Cancel = true;
                };

    P.S. На alt F4 она по идее и не должна закрываться
    Ответ написан
    Комментировать
  • System.OverflowException: Arithmetic operation resulted in an overflow?

    twobomb
    @twobomb
    Graphics graph = null;
    var bmp = new Bitmap(System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width, System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height);
    graph = Graphics.FromImage(bmp);
    graph.CopyFromScreen(0, 0, 0, 0, bmp.Size);
    string desktop = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
    string path = desktop + @"\ВАЖН0\text\" ;
    if (!Directory.Exists(path))
    Directory.CreateDirectory(path);
    bmp.Save(path+"1.jpg",ImageFormat.Jpeg);

    Ток добавь ссылку на WinForms или используй SystemInformation или чёто другое для получения разрешения.
    P.S. По поводу скриншота с камеры код из интернета прекрасно работает, прооверил без ошибок
    using System;
    using System.Runtime.InteropServices;
    
    namespace ConsoleApplication2
    {
        class Program
        {
    
            private const int WM_CAP_DRIVER_CONNECT = 0x40a;
            private const int WM_CAP_DRIVER_DISCONNECT = 0x40b;
            private const int WS_CHILD = 0x40000000;
            private const int WS_POPUP = unchecked((int)0x80000000);
            private const int WM_CAP_SAVEDIB = 0x419;
    
            [DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
            public static extern IntPtr capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);
    
            [DllImport("user32", EntryPoint = "SendMessage")]
            public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
    
            public static void Main()
            {
                String dName = "".PadRight(100);
                String dVersion = "".PadRight(100);
                IntPtr hWndC = capCreateCaptureWindowA("VFW Capture", WS_POPUP | WS_CHILD, 0, 0, 320, 240, 0, 0); // узнать дескриптор камеры
                SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); //подключиться к камере
                string path = @"D:\test.jpg";
                IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
                SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt32()); // сохранить скриншот
                SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); //отключить камеру
            }
        }
    }
    Ответ написан
  • Как посчитать кол-во вхождение в string (C#)?

    twobomb
    @twobomb
    string value = "привет привет hi привет hi";
    var counts = value.Split(' ').Distinct().Select(s => s+" = "+ value.Split(' ').Count(z => z == s));
    foreach (var item in counts)
         Console.WriteLine(item);


    привет = 3
    hi = 2
    Ответ написан
    1 комментарий
  • Как составить запрос правильно?

    twobomb
    @twobomb
    Попробуй
    var values = new List<KeyValuePair<string, string>>
                {
                    new KeyValuePair<string, string>("Page", Page),
                    new KeyValuePair<string, string>("Sides[0]", side1),
                    new KeyValuePair<string, string>("Sides[1]", side2),
                       ....
                };

    Или
    var values = new List<KeyValuePair<string, string>>
                {
                    new KeyValuePair<string, string>("Page", Page)
                };
    for(var i = 0; i < sides.Length;i++)
      values.Add( new KeyValuePair<string, string>("Sides["+i+"]", sides[i]));

    P.S. На крайняк можно написать свой метод http_build_query, который будет принимать какой нибудь Dictinary < string ,object >, и по умному формировать этот массив. Хотя возможно уже есть какой нибудь похожий метод нужно читать доки
    Ответ написан
    Комментировать
  • Почему не получается загрузить файл из папки на сервер через UploadFile?

    twobomb
    @twobomb
    Попробуйте
    var responseFile = Encoding.ASCII.GetString(wc.UploadFile(p, @".\TEST\test.txt"));  // p - адрес загрузки
    Ответ написан
  • Как правильно реализовать тормоз на машине?

    twobomb
    @twobomb
    Также как и разгон только в другую сторону. Или вектор поменяй назад или умножай на скорость со знаком минус
    Ответ написан
  • Как сделать так чтобы при закрытие формы основная форма не закрывалось?

    twobomb
    @twobomb
    Я так понял это WinForms? Как вариант на событие закрытия главной формы повесить обрабтчик который будет отслеживать открыта ли вторая форма, если открыта, то он будет скрывать окно. Ну и на событие закрытия второй формы отслеживать если первое окно скрыто, то закрыть и его чтобы завершилась программа.
    Еще один такой себе вариант, на открытие нового окна создаем новый поток и запускаем его, в нем открываем окно через showdialog, но оно откроется как отдельное окно не зависимое от первого и в тоже время засинхронит поток, тоесть пока оно не закроется поток не завершится, а пока поток не завершиться и программа не завершиться. Типа такого
    Thread t = new Thread(new ParameterizedThreadStart((o) =>
                {
                 Form   form = new Form2();
                    form.ShowDialog();
                }));
                t.Start();
    Ответ написан
  • Как добавлять объекты в файл с помощью сериализации?

    twobomb
    @twobomb
    Как вариант использовать лист ваших объектов, записывать его и при добавлении, читаем, добавляем и перезаписываем. Вот накидал пример, используя лист object'ов, в принципе можете и этот пример использовать просто потом лист object'ов преобразовывайте в лист Book'ов

    static void Main()
            {
                addObject(123, @"D:\out.bin");
                addObject(new StringBuilder("lalalla"), @"D:\out.bin");
                addObject(new Point(10,20), @"D:\out.bin");
    
                var test = getObjects(@"D:\out.bin");//[int(123),string(lalalal), Point(10,20)]
            }
    
            public static void addObject(object obj,string path){
                BinaryFormatter formatter = new BinaryFormatter();
                List<object> objs = new List<object>();
                if (File.Exists(path))
                    using (FileStream fs = File.Open(path, FileMode.Open))
                        objs = (List<object>)formatter.Deserialize(fs);
                objs.Add(obj);
                using (FileStream fs = File.Create(path))
                    formatter.Serialize(fs,objs);
            }
    
    
            public static List<object> getObjects(string path){
                BinaryFormatter formatter = new BinaryFormatter();
                List<object> objs = new List<object>();
                if (File.Exists(path))
                    using (FileStream fs = File.Open(path, FileMode.Open))
                        objs = (List<object>)formatter.Deserialize(fs);
                return objs;
            }

    P.S. С append'ом точно ничего не получится. C# записывает всё в своем формате, описывая типы и данные всё вместе. С append'ом только если вы придумаете свой формат и напишите методы сериализации\десериализации хотя-бы например для своего класса.
    Ответ написан
  • При выполнении асинхронного метода вылезает ошибка, в чём проблема?

    twobomb
    @twobomb
    Потому-что ты пытаешься получит доступ к контролу из другого потока, используй инвок
    private async void Button_Click(object sender, RoutedEventArgs e)
            {
                await Task.Run( () => 
                { 
                    for (int i = 0; i < 101; i++)
                    {
    Dispatcher.Invoke((Action)(() =>
                {
                        label1.Content = i.ToString();
                }));
                        Thread.Sleep(1000);
                    }
                });
            }
    Ответ написан
    1 комментарий
  • Как в C# изменить одну строку в файле?

    twobomb
    @twobomb
    Накидал пример для однобайтовой кодировки.

    rewriteLineText(3, @"D:\mytext.txt", "Новое значение");//№ линии, путь к файлу, значение
    
            static void rewriteLineText(int rewriteLine,string path,string str){
    
                FileStream fs = new FileStream(path, FileMode.Open);
                var buff = new byte[1];
                int byteStart = rewriteLine == 1 ? 0 : -1, byteEnd = -1;
    
                for (int i = 0, line = 1; i < fs.Length; i++){
                    fs.Read(buff, 0, 1);
                    if (buff[0] == 10){//10 - перенос строки
                        if (line == rewriteLine)
                        {
                            byteEnd = i;
                            break;
                        }
                        line++;
                        if (line == rewriteLine)
                            byteStart = i + 1;
                    }
                    if (i == fs.Length - 1)
                        byteEnd = i;
                }
                if (byteStart == -1 || byteEnd == -1)
                    return;
                var strByte = Encoding.UTF8.GetBytes(str);
                fs.Position = byteEnd;
                var tailBuff = new byte[fs.Length - byteEnd];
                fs.Read(tailBuff, 0, (int)(fs.Length - byteEnd));
                fs.Position = byteStart;
                fs.Write(strByte, 0, strByte.Length);
                fs.Write(tailBuff, 0, tailBuff.Length);
                fs.SetLength(byteStart + strByte.Length + tailBuff.Length);
                fs.Close();
            }
    Ответ написан
    Комментировать
  • Как найти индекс элемента одномерного массива с ФИО по фамилии?

    twobomb
    @twobomb
    string[] array = { "Иванов Иван Иванович", "Сидоров Сидор Сидорович", "Петров Петр Петрович" };
                var find = "сид";
                var finded = array.Where(v => v.Split(' ')[0].ToLower().Contains(find)).ToList();//[0] Сидоров Сидор Сидорович

    P.S. Если нужно не частичное, а полное совпадение, то поменять Contains на Equals
    Ответ написан
  • Как решить задачи на C#?

    twobomb
    @twobomb
    Пример с чтением\записью для первого, с остальными разберетесь
    static void Main()       {
                StreamReader sr = File.OpenText(@"D:\mytext.txt");
                List<string> data = new List<string>();
                while (!sr.EndOfStream)
                    data.Add(sr.ReadLine());
                sr.Close();
                StreamWriter sw = new StreamWriter(File.Open(@"D:\mytext.txt", FileMode.Create));
                var exp = new List<string>() {"a", "o", "а", "о"};
                data = data.Select(s => exp.Contains(s.Trim().ToLower()) ? "1" : s).ToList();
                foreach (var v in data)
                    sw.WriteLine(v);
                sw.Close();
            }
    Ответ написан
    Комментировать
  • Как мне сделать чтобы игрок двигался к ближнему прифабу?

    twobomb
    @twobomb
    Я так понимаю Unity? Тег добавляйте.
    Vector2.distance
    Также есть аналог для Vector3 если 3д
    Ответ написан
  • Кикие библиотеки изучать для написание программы с интерфейсом?

    twobomb
    @twobomb
    Лучше используйте WPF. Тут руководство с примерами
    P.S. В частности начните с разделов 3,4,6, 15(если работали с бд, если не работали начинайте учить прямо сейчас), 20
    Ответ написан
    Комментировать
  • Подойдёт ли мне сериализация?

    twobomb
    @twobomb
    Чёт не совсем понял, а что нельзя эти команды бросить на отдельный поток и тормозить\возообновлять его через Suspend\Resume? И зачем запоминать
    Типа такого
    public static void Main()
            {
    
                Thread t = new Thread(new ThreadStart(command));
                t.Start();
                Thread.Sleep(5000);
                t.Suspend();
                Thread.Sleep(5000);
                t.Resume();
                Console.ReadKey();
            }
            public static void command(){
                for (var i = 0; i < 10; i++)
                {
                    Console.WriteLine(i.ToString());
                    Thread.Sleep(1000);
                }
            }
    Ответ написан
    Комментировать
  • Как в WPF сделать ограничение на некоторые символы в TextBox?

    twobomb
    @twobomb
    Должны работать, вешайте на событие PreviewTextInput и проверяйте не e.KeyChar,а e.Text
    типа
    public Window()
            {
                InitializeComponent();
                this.textBox.PreviewTextInput += new TextCompositionEventHandler(textBox_PreviewTextInput);
            }
     
            void textBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                if (!Char.IsDigit(e.Text,0)) e.Handled = true;
            }
    Ответ написан
    1 комментарий
  • Как заполнять массив введёнными пользователем числами?

    twobomb
    @twobomb
    Ваш вариант, исправленный
    int[] firstMas = new int[0];
                while (true) {
                    string userInput = Console.ReadLine();
                    if (userInput == "exit")
                    {
                        break;
                    }
                    else if (userInput == "sum")
                    {
                        int sum = 0;
                        for (int i = 0; i < firstMas.Length; i++)
                            sum += firstMas[i];
                            Console.WriteLine("Сумма введённых чисел равна " + sum);
                    }
                    else
                    {
                        int[] secondMas = new int[firstMas.Length + 1];
                        int number = Convert.ToInt32(userInput);
                        secondMas[secondMas.Length - 1] = number;
                        for (int i = 0; i < firstMas.Length; i++)
                            secondMas[i] = firstMas[i];
                        firstMas = secondMas;
                        Console.WriteLine("Длинна массива: " + firstMas.Length);
                    }

    Новый вариант
    int[] arr = new int[0];
                while (true){
                    string s = Console.ReadLine();
                    switch (s){
                        case "exit":
                            return;
                        case "sum":
                            Console.WriteLine(String.Format("Сумма введённых чисел = '{0}'", arr.Sum()));
                            break;
                        default:
                            int result;
                            if (int.TryParse(s, out result))
                                arr = arr.Concat(new int[] { result }).ToArray();
                            break;
    
                    }
                }
    Ответ написан
  • Как получить процессы с одинаковыми названиями?

    twobomb
    @twobomb
    Найти все процессы с таким же именем как у нашей программы, исключая нашу программу и закрыть...
    var curId = Process.GetCurrentProcess().Id;
                var procName = Process.GetCurrentProcess().ProcessName;
                var processes = Process.GetProcesses().Where(p => p.ProcessName == procName && p.Id != curId).ToList();
                processes.ForEach(p => p.CloseMainWindow());
    Ответ написан
    1 комментарий
  • Какую ошибку я допустил?

    twobomb
    @twobomb
    Инициализируйте num изначально
    int num = 0;
    P.S. Дело в том что блок finally выполяется в любом случае, а если я введу вместо числа слово из трех букв то сначла отработает кетч на несоотвествие типа, а потом мой *** попытается перевести в дабл и возвести во вторую степень.
    Правильно этот код было бы написать как-то так
    Console.Write("Введите целое число -> ");
                int num;
                try
                {
                    num = Convert.ToInt32(Console.ReadLine());
                    Console.WriteLine("Ваше число в квадрате -> " + Math.Pow(Convert.ToDouble(num), 2.0));
                }
                catch (FormatException)
                {
                    Console.WriteLine("Несоответствие типа.");
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
    Ответ написан
    Комментировать
  • Калькулятор DataGridVeiw сложения в столбцах?

    twobomb
    @twobomb
    public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                dataGridView1.CellEndEdit += dataGridView1_CellEndEdit;
    
            }
    
            public void recalculateRow(int rowInx){
             
                var zak = dataGridView1.Rows[rowInx].Cells[0].Value;   
                var perc = dataGridView1.Rows[rowInx].Cells[1].Value;
                dataGridView1.Rows[rowInx].Cells[2].Value = "";
                if (zak == null || perc == null)
                    return;
                try{
                    dataGridView1.Rows[rowInx].Cells[2].Value = float.Parse(zak.ToString()) + float.Parse(zak.ToString()) *  (float.Parse(perc.ToString())/100);
                }catch(FormatException e){
    
                }
            }
            private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)        {
                recalculateRow(e.RowIndex);
            }
        }
    Ответ написан
    1 комментарий