• Как синхронизировать положение ползунков полос прокрутки в двух RichTextBox?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace WindowsFormsApplication9
    {
      public partial class Form1 : Form
      {
    
        /// <summary>
        /// Получает текущее положение ползунка полосы прокрутки.
        /// </summary>
        /// <param name="hWnd">Дескриптор.</param>
        /// <param name="nBar">Тип.</param>
        /// <returns></returns>
        [DllImport("User32.dll")]
        public extern static int GetScrollPos(IntPtr hWnd, int nBar);
    
        /// <summary>
        /// Функция для отправки сообщений.
        /// </summary>
        /// <param name="hWnd">Дескриптор.</param>
        /// <param name="msg">Само сообщение.</param>
        /// <param name="wParam">Параметры.</param>
        /// <param name="lParam">Дополнительные параметры.</param>
        [DllImport("User32.dll")]
        public extern static int SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
    
        public enum ScrollBarType : uint
        {
          SbHorz = 0,
          SbVert = 1,
          SbCtl = 2,
          SbBoth = 3
        }
    
        public enum Message : uint
        {
          /// <summary>
          /// Сообщение для вертикальной полосы прокрутки
          /// </summary>
          WM_VSCROLL = 0x0115
        }
    
        public enum ScrollBarCommands : uint
        {
          /// <summary>
          /// Положение ползунка полосы прокрутки в конце операции
          /// </summary>
          SB_THUMBPOSITION = 4
        }
    
        private RichTextBox rich1 = new RichTextBox();
        private RichTextBox rich2 = new RichTextBox();
    
    
        public Form1()
        {
          InitializeComponent();
    
          // тестовый текст
          string text = "";
          for (int i = 0; i < 99; i++)
          {
            text += "Имеется 2 richTextBox, нужно установить значение текущего вертикального скролла первого, как у в данный момент у второго. Пробовал всякие offset, копался в гугле, но ничего внятного не нашел.\r\n";
          }
    
          // добавляем поля на форму
          rich1.Name = "rich1";
          rich1.Dock = DockStyle.Top;
          rich1.Text = text;
          rich1.VScroll += rich_VScroll;
          this.Controls.Add(rich1);
    
          rich2.Name = "rich2";
          rich2.Dock = DockStyle.Top;
          rich2.Text = text;
          rich2.VScroll += rich_VScroll;
          this.Controls.Add(rich2);
        }
    
        /// <summary>
        /// Обработчик изменения положения ползунка полосы прокрутки.
        /// </summary>
        private void rich_VScroll(object sender, EventArgs e)
        {
          // кто вызвал событие
          RichTextBox currentRich = (RichTextBox)sender;
          // если событие вызвал rich2, то второй будет rich1 и наоборот
          RichTextBox otherRich = currentRich.Name.Equals("rich1") ? rich2 : rich1;
    
          // получаем позицию ползунка полосы прокрутки текущего поля
          int pos = GetScrollPos(currentRich.Handle, (int)ScrollBarType.SbVert);
          pos <<= 16;
    
          // чтобы не застрять в бесконечности 
          // (можно так не делать и прикрутить обработчик только к одному полю)
          otherRich.VScroll -= rich_VScroll; 
          // --
    
          // передаем позицию во второе поле
          uint par = (uint)ScrollBarCommands.SB_THUMBPOSITION | (uint)pos;
          SendMessage(otherRich.Handle, (int)Message.WM_VSCROLL, new IntPtr(par), new IntPtr(0));
          otherRich.VScroll += rich_VScroll;
        }
      }
    }
    Ответ написан
    2 комментария
  • Какие наилучшие материалы по реверс-инжинирингу (игр)?

    TrueBers
    @TrueBers
    Гуглю за еду
    Хоть и некропостинг, но уж наткнулся случайно. Раз уж помеченного ответа нет, отвечу, если ещё не забросили эту тему и не поломали пару онлайн игр =).

    Введение в крекинг с нуля Рикардо Нарвахи -- прекрасный курс. Написано очень подробно, куча полезных маст-хев трюков. Однозначно, курить! (если ещё не прошли)
    Все команды ассемблера знать, конечно, не нужно. Достаточно основных пары десятков, знать какие флаги меняют, какие операнды используются, и т. д. Остальные легко найти в Intel Software Developer Manuals.

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

    Далее, когда уже найден какой-то ключевой поинт, в котором, кажется, кроется нужная фича, берём IDA Pro и в качестве дизассемблера/декомпилятора потихоньку реверсим алгоритм. Дальше нужно будет курить IDA Script или IdaPython для автоматизации рутинных действий.

    Также ещё довольно полезной фичей будет инструментация кода с помощью фреймворков типа Intel Pin Tool или DynamoRio. Но тут уже надо иметь скилл повыше, чем 2+2 в ассемблере, но результат стоит того.
    Ответ написан
    Комментировать
  • Как отправить запрос программе с сайта?

    @iliyat
    web developer
    Если грубо - то тебе нужно превратить свою программу в сервер, чтобы она могла принимать входящие запросы, например слушать адрес:порт как http-сервер или использовать сокеты.
    Ответ написан
    2 комментария
  • Как отправить запрос программе с сайта?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Для того, чтобы тебе ответить, надо понимать твои фантазии.
    поэтому напиши подробно, что ты понимаешь под такими терминами, как
    • сервер
    • программа
    • запрос
    • консоль

    плюс было бы полезно знать, для чего это все тебе понадобилось
    Ответ написан
    1 комментарий
  • Получить изображение с поискового запроса?

    @TsSaltan
    Можно заюзать api гугла:
    https://ajax.googleapis.com/ajax/services/search/images?v=1.0&imgsz=medium&q=Кот

    Меняем параметры imgsz и q на свои
    Первое изображение в json объекте: [responseData][results][0][unescapedUrl]
    Ответ написан
    3 комментария
  • Нужно ли использовать структуры в C#?

    @Sumor
    Используйте классы, если вы не видите преимуществ использования структур в вашем коде.
    Не уверен, что использование структуры со строкой внутри в листе быстрее использования аналогичного класса. Особенно по сравнению со временем доступа к СУБД.
    Подробнее про структуры в MSDN
    Структуры можно использовать:
    1. Если у вас связь с неуправляемым кодом, где ожидается подобная структура.
    2. Если вам критично использование value-типов.
    При этом нужно не забывать об особенностях их использования, например, что при присваивании или передачи в функцию структура копируется. Наверняка можно написать пример, где из-за этого производительность работы с большой структурой будет ниже, чем с классом.
    Ответ написан
    Комментировать
  • Алгоритм решения выражений?

    Neuroware
    @Neuroware
    Программист в свободное от работы время
    Если это не "для зачета" а реальный проект то можно подключить Api wolfram и получить полный математический пакет со всеми вытекающими плюшками.
    Ответ написан
    Комментировать
  • Алгоритм решения выражений?

    Ещё можно написать синтаксический анализатор на специальном языке — ищите по словам yacc (для Си), javacc, jjtree (для Java), bison (для Си, Си++ и Java). Вот, к примеру, простенькая JJTree-грамматика, которая разбирает примерно такие выражения, как вам нужно, с поддержкой переменных, шестнадцатеричных чисел, комментариев и т. д. И всего сто строчек. Используя JavaCC+JJTree вы по файлу грамматики автоматически можете создать Java-классы, которые позволят легко превратить выражение в абстрактное синтаксическое дерево (AST). По этому дереву уже можно сделать что угодно — выполнить вычисления, скомпилировать в машинный код, перевести в любой другой язык (скажем, MathML), красиво отрендерить на экране с многоэтажными дробями и т. д. Файлы грамматик обычно гораздо проще поддерживать и расширять, чем ковыряться с рекурсивным спуском.
    Ответ написан
    Комментировать
  • Алгоритм решения выражений?

    hezymal
    @hezymal
    Программист-хардкорщик
    Есть такой метод: "Обратная польская нотация"
    Дальше по ссылке: algolist.manual.ru/syntax/revpn.php
    Ответ написан
    Комментировать
  • Эмуляция Ctrl + V?

    Можно еще вот так. Но для этого нужно Ctrl + C реализовать и использовать в нем для помещения в буфер Clipboard.SetDataObject().

    private void textBox1_KeyDown(object sender, KeyEventArgs e)
            {
                if ((e.KeyCode == Keys.V) && (e.Modifiers == Keys.Control))
                {
                    Clipboard.Clear();
                    this.textBox1.Text =Clipboard.GetText();
                }
    
            }
    Ответ написан
    Комментировать
  • Эмуляция Ctrl + V?

    @Juninho
    Попробуй
    [DllImport("user32.dll", SetLastError = true)]
    private static extern void keybd_event( byte bVk, byte bScan, uint dwFlags, int dwExtraInfo );
     
    private static void SendCtrlhotKey( char key ) {
      keybd_event(      0x11, 0,   0, 0);
      keybd_event( (byte)key, 0,   0, 0);
      keybd_event( (byte)key, 0, 0x2, 0);
      keybd_event(      0x11, 0, 0x2, 0);
    }
     
    // использовать вот так
    SendCtrlhotKey( 'C' );
    // использовать или так
    SendCtrlhotKey( 'V' );
    // использовать или так
    SendCtrlhotKey( 'A' );
    Ответ написан
    1 комментарий
  • Не работает FindWindow?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    У меня работает:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    
    namespace ConsoleApplication13
    {
      class Program
      {
        [DllImportAttribute("User32.dll")]
        private static extern int FindWindow(String ClassName, String WindowName);
    
        [DllImportAttribute("User32.dll")]
        private static extern IntPtr SetForegroundWindow(int hWnd);
    
        static void Main(string[] args)
        {
          int hWnd = FindWindow(null, "Калькулятор");
          Console.WriteLine(hWnd);
          if (hWnd > 0)
          {
            Console.WriteLine("К счастью, окно найдено...");
            SetForegroundWindow(hWnd); 
          }
          else
          {
            Console.WriteLine("Окно не найдено!");
          }
          Console.ReadKey();
        }
      }
    }

    С использованием класса Process, этот код должен активировать все открытые калькуляторы:
    static void Main(string[] args)
    {
      foreach (var p in Process.GetProcessesByName("calc"))
      {
        SetForegroundWindow(p.MainWindowHandle.ToInt32()); 
      }
    
      Console.ReadKey();
    }
    Ответ написан
    2 комментария
  • Visual Studio очень долгая установка, что делать?

    PauloDinosaur
    @PauloDinosaur Автор вопроса
    Начинающий
    Установил 2й раз, ту удалил. на конце установки выбило ERROR и теперь фиг его знает что делать.
    ПК в сон не уходит.
    ОС переустанавливать не буду т.к. стоит лицензия
    Места на дисках предостаточно
    ____________________________________________________
    Я так понял комп был "засран" помогло восстановление системы и установка по новой
    Ответ написан
    Комментировать
  • Как можно представить 4 - х мерный массив?

    Taraflex
    @Taraflex
    Ищу работу. Контакты в профиле.
    Как клетки с курицами на птицефайбрике.
    pt.jpg
    Ответ написан
    Комментировать
  • Какие требования у.NET при стандартной сериализации?

    AlekseyNemiro
    @AlekseyNemiro
    full-stack developer
    Чтобы класс можно было сериализовать, необходимо пометить его атрибутом [Serializable].
    [Serializable]
    public class MyClass 
    {
    }

    Атрибут [Serializable] также должны иметь все типы, которые включены в класс. Если у какого-то из типов не будет этого атрибута, то при попытке выполнить сериализацию, возникнет исключение. Это минимум, что необходимо.

    Для двоичной сериализации используется класс BinaryFormatter.
    // данные, которые будем сериализовать
    var data = new List<int> { 1, 2, 3 };
    
    // выполняем сериализацию 
    // в MemoryStream (можно в любой Stream)
    var bf = new BinaryFormatter();
    var m = new MemoryStream();
    bf.Serialize(m, data);
                
    // курсор потока переводим в начало, т.к. мы работали с потоком выше
    // если открывать новый поток, то это делать не обязательно
    m.Position = 0;
    // выполняем десериализацию данных из MemoryStream
    var result = (List<int>)bf.Deserialize(m);
    
    // выводим результат в консоль
    result.ForEach(itm => Console.WriteLine(itm));


    Если в объекте попадется тип, который не помечен атрибутом [Serializable], то можно реализовать в классе интерфейс ISerializable. Либо сделать для этого типа отдельный класс, реализующий интерфейс ISerializable. При этом, не забывая про атрибут [Serializable], который обязательно должен присутствовать.

    При реализации интерфейса ISerializable, в классе нужно определит метод GetObjectData, который будет подготавливать данные для сериализации. А также реализовать перегрузку конструктора для принятия сериализованных данных.
    public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
    {
      if (info == null)
      {
        throw new ArgumentNullException("info");
      }
      info.AddValue("Ключ", "Значение");
      info.AddValue("Ключ2", this.ИмяСвойства); 
      // и т.д.
    }
    
    // конструктор
    protected ИмяКласса(SerializationInfo info, StreamingContext context)
    {
      if (info == null)
      {
        throw new ArgumentNullException("info");
      }
      this.Свойство = info.GetValue("Ключ", typeof(типДанных));
      this.ИмяСвойства = (string)info.GetValue("Ключ2", typeof(string));
      // и т.д.
    }

    Часто спрашивают, как сериализовать Dictionary<TKey, TValue>. На основе всего выше изложенного, можно сделать вот такой класс:
    [Serializable]
    public class MyDictionary : Dictionary<string, object>, ISerializable
    {
    
      public MyDictionary() { }
    
      protected MyDictionary(SerializationInfo info, StreamingContext context)
      {
        if (info == null)
        {
          throw new ArgumentNullException("info");
        }
        int count = info.GetInt32("Count"); // получаем число элементов
        for (int i = 0; i < count; i++) // перебираем элементы
        {
          // получаем ключ и значение по индексу элемента
          string key = info.GetString(String.Format("ItemKey{0}", i));
          object value = info.GetValue(String.Format("ItemValue{0}", i), typeof(object));
          // добавляем элемент в себя
          this.Add(key, value);
        }
      }
    
      public void GetObjectData(SerializationInfo info, StreamingContext context)
      {
        if (info == null)
        {
          throw new ArgumentNullException("info");
        }
        // перебираем все элементы коллекции
        int i = 0;
        foreach (KeyValuePair<string, object> item in this)
        {
          // добавляем отдельно ключ и значение
          info.AddValue(String.Format("ItemKey{0}", i), item.Key, typeof(string));
          info.AddValue(String.Format("ItemValue{0}", i), item.Value);
          i++;
        }
        // запоминаем, сколько всего элементов
        info.AddValue("Count", this.Count);
      }
    }

    Пример использования:
    // выполняем сериализацию коллекции
    var data = new MyDictionary();
    data.Add("Key", "Value");
    data.Add("Key2", "Value2");
    data.Add("Key3", 123);
    
    var bf = new BinaryFormatter();
    var m = new MemoryStream();
    bf.Serialize(m, data);
    
    // выполняем десериализацию
    m.Position = 0;
    var result = (MyDictionary)bf.Deserialize(m);
    
    // выводим результат
    foreach (var item in result)
    {
      Console.WriteLine("{0} = {1}", item.Key, item.Value);
    }

    Посмотреть в .NET Fiddle, как это работает.
    Ответ написан
    Комментировать
  • DllImport в C++?

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Есть два варианта - вы загружаете dll во время работы программы, или компонуетесь к этой dll изначально. В зависимости от этого, кардинально меняется способ связывания программы и DLL.
    Ответ написан
    5 комментариев
  • А у вас есть тетрадка, куда вы записываете наброски кода?

    Mrrl
    @Mrrl
    Заводчик кардиганов
    Раньше использовал большие 160-листовые тетради формата A4. Записывал всё подряд - планы, структуры программ и алгоритмов, описания на псевдокоде, в сложных случаях - куски кода, заметки при отладке... Пару лет назад попытался перейти на S Note на Самсунге, но пришел к выводу, что экран слишком маленький - тетрадка даёт гораздо лучшее разрешение. Сейчас использую для записей жёлтые блокноты (формата A5), думаю, что скоро опять вернусь к тетрадкам. Если они ещё будут в продаже.
    Ответ написан
    2 комментария
  • Что будет если просрочить задание на Odesk-е?

    RicoX
    @RicoX
    Ушел на http://ru.stackoverflow.com/
    В худшем случае - получите плохой отзыв, но тут есть несколько путей:
    1) Вернуть заказчику деньги, что не позволит ему испортить вам рейтинг
    2) Договориться полюбовно, если он готов ждать, а вы сделаете скидку или какую-то фичу бесплатно.
    Ответ написан
    2 комментария