Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Открыть новую тему     Написать ответ в эту тему

Mextrom



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ZBEP
Сам метод StrToHex  я бы написал так
Код:
private string StringToHex (string str)
        {
            StringBuilder sb = new StringBuilder ();
            for (int i = 0; i < str.Length; i++)
            {
                sb.AppendFormat("{0:x} ", (uint)str[i]);
            }
            sb.Remove (sb.Length - 1, 1);
            return sb.ToString ();
        }
А что касается
Цитата:
Как мне сделать так, что бы StrToHex делала из "Слово" -> "D1 EB EE E2 EE", а не "421 43B 43E 432 43E" или "D0 A1 D0 BB D0 BE D0 B2 D0 BE" ?
, то надо, чтобы строка "Слово" была в кодировке ASCII, а не Unicode. Вы строку откуда берете? Просто в код подставляете или считываете откуда-то?

Всего записей: 854 | Зарегистр. 30-03-2005 | Отправлено: 12:58 09-02-2011 | Исправлено: Mextrom, 13:00 09-02-2011
ZBEP



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mextrom, из фала гружу в richTextBox.
 
Добавлено:
Вот мне подсказали как правильно переводить русские символы из String в Hex:

Код:
 
        static private string StrToHexRus(string sIn)
        {
            // Create a UTF-8 encoding.
            UTF8Encoding utf8 = new UTF8Encoding();
            Byte[] encodedBytes = utf8.GetBytes( sIn );
            encodedBytes = UTF8Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding(1251), encodedBytes);
 
            string sResult = "";
            foreach (Byte b in encodedBytes)
            {
                sResult += b > 15 ? String.Format("{0:X} ", b) : String.Format("0{0:X} ", b);  
            }
            return sResult;
        }

Сейчас пытаюсь понять:

Код:
sResult += b > 15 ? String.Format("{0:X} ", b) : String.Format("0{0:X} ", b);

Что бы сделать обратное, но либо я не в том направлении думаю либо хз..

Всего записей: 186 | Зарегистр. 09-04-2009 | Отправлено: 13:54 09-02-2011 | Исправлено: ZBEP, 13:54 09-02-2011
Mextrom



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ZBEP
Для случая кодировки cp-1251 могу предложить такой вариант (маленькая тестовая программа):

Код:
using System;
using System.Globalization;
using System.Text;
 
namespace Test
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            string source = Console.ReadLine();
            string hexStr = StringToHex(source);
            Console.WriteLine(hexStr);
            Console.WriteLine(HexToString(hexStr));
        }
 
        private static string StringToHex(string str)
        {
            byte[] bytes = Encoding.GetEncoding(1251).GetBytes(str);
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                sb.AppendFormat("{0:x} ", bytes[i]);
            }
            sb.Remove(sb.Length - 1, 1);
            return sb.ToString();
        }
 
        private static string HexToString(string hexStr)
        {
            char[] separators = new char[1] { ' ' };
            string[] chars = hexStr.Split(separators, StringSplitOptions.RemoveEmptyEntries);
            byte[] bytes = new byte[chars.Length];
            for (int i = 0; i < chars.Length; i++)
            {
                bytes[i] = byte.Parse(chars[i], NumberStyles.AllowHexSpecifier);
            }
            return Encoding.GetEncoding(1251).GetString(bytes);
        }
    }
}
 
Нужно ли конвертировать строку из cp-1251 в UTF8, вам видней .

Всего записей: 854 | Зарегистр. 30-03-2005 | Отправлено: 22:20 09-02-2011
ZBEP



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mextrom, Спасибо!
Работает как надо

Всего записей: 186 | Зарегистр. 09-04-2009 | Отправлено: 00:06 10-02-2011
leonidSDF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. Самостоятельно изучаю С# и столкнулся с проблемой если попытаться реализовать измеритель пробега мыши, то как сделать так чтобы с переходом на другую форму измеритель продолжал работать. Как получить координаты мыши я знаю. Мне сказали что нужно подключить какой-то ХУК, Dll, как это делается
Заранее Спасибо

Всего записей: 3 | Зарегистр. 10-02-2011 | Отправлено: 11:49 10-02-2011 | Исправлено: leonidSDF, 12:58 10-02-2011
Mextrom



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
leonidSDF
Посмотрите здесь

Всего записей: 854 | Зарегистр. 30-03-2005 | Отправлено: 16:58 11-02-2011
leonidSDF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте, спасибо за ссылку. Пришлось помучится, но все таки реализовал. Но есть несколько неприятных моментов, если кто может, подскажите. Первое заменил я у Тауба Console на messageBox, чтобы программа выдавала код нажатой кнопки и поставил кнопку, чтобы можно было хук отключать. MessageBox вылезает сразу, после этого все виснет примерно секунд на пять, програмама не отвечает, потом очухивается и снова продолжает работать. и так каждый раз при срабатывание хука на всех платформах и компьютерах. Ниже приведен код файла Form1.
 
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;
using System.Diagnostics;
namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        private static IntPtr _hookID = IntPtr.Zero;
        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private static LowLevelKeyboardProc _proc = HookCallback;
       
  public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e) { }
 
        private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            Process pr = Process.GetCurrentProcess();
            ProcessModule prM = pr.MainModule;
            return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(prM.ModuleName), 0);
        }
 
        public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
         
private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int vkCode = Marshal.ReadInt32(lParam);
                MessageBox.Show(((Keys)vkCode).ToString());
            }
            return CallNextHookEx(_hookID, nCode, wParam, lParam);
        }
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr SetWindowsHookEx(int idHook,
            LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool UnhookWindowsHookEx(IntPtr hhk);
 
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode,
            IntPtr wParam, IntPtr lParam);
 
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern IntPtr GetModuleHandle(string lpModuleName);
         
private void button1_Click(object sender, EventArgs e)
        {
            if (this.button1.Text == "SetHook")
            {
                this.button1.Text = "UnHook";
                _hookID = SetHook(_proc);
            }
            else
            {
                this.button1.Text = "SetHook";
                UnhookWindowsHookEx(_hookID);
            }
        }
    }
}
есть еще проблемка. в коде есть функция private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam), в которую вставил messageBox. решил вместо него поставить метку и менять текст по событию . ОДНАКО, указать this.label1.text я не могу потому как это является static методом. Выкрутился я так, создал static переменную, присваиваю ей vkCode  и по таймеру ее обновляю (кстати при таком способе не тормозит). А как сделать так, чтобы оно обновлялось по приходу этого события, что это за проблемка со static методами и this.label, может есть способ указать грамотно ссылку к объекту label.text и этого будет достаточно.
Заранее благодарю.

Всего записей: 3 | Зарегистр. 10-02-2011 | Отправлено: 05:30 15-02-2011 | Исправлено: leonidSDF, 12:27 15-02-2011
giv5dot26



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте. В моей программе присутствует функция открытия файла через диалоговое окно. Пробую запускать программу в XP и ниже не работает вываливается необрабатываемое исключение (обработку исключений я еще не реализовывал). А в чем собственно подвох? Visual Studio 2008. C#.

Всего записей: 302 | Зарегистр. 25-07-2007 | Отправлено: 11:41 16-02-2011
Omicron_Persey_8



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
leonidSDF

Цитата:
А как сделать так, чтобы оно обновлялось по приходу этого события, что это за проблемка со static методами и this.label, может есть способ указать грамотно ссылку к объекту label.text и этого будет достаточно.

Так же, как и с vkCode. Делаешь статическую переменную для label, инициализируешь ее в конструкторе после InitializeComponent, и в HookCallback она у тебя будет доступна.
 
giv5dot26
Без кода трудно сказать.

Всего записей: 282 | Зарегистр. 02-09-2007 | Отправлено: 15:00 16-02-2011
giv5dot26



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот пожалуйста:

Код:
         
        private void Tabs_DblClick(object sender, System.EventArgs e)
        {
            byte x;
            int y;
            DlgOpenFile.ShowDialog();
            y = DlgOpenFile.FileNames.Count() - 1;
            if (!FileOpened)
                return;
            if (y >= 18)
            {
                MessageBox.Show("Нужно выбрать не более 18 файлов!");
                FileOpened = false;
                return;
            }
            for (x = 0; x <= y; x++)
            {
                Foo(DlgOpenFile.FileNames[x]);
            }            
        }
 


Всего записей: 302 | Зарегистр. 25-07-2007 | Отправлено: 04:10 17-02-2011
leonidSDF

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Здравствуйте.
----
OMICRON PERSEY - 8 Так же, как и с vkCode. Делаешь статическую переменную для label, инициализируешь ее в конструкторе после InitializeComponent, и в HookCallback она у тебя будет доступна.
----
Можно уточнить. Создать статическую переменную ни чего не стоит. У меня уже есть программа которая работает примерно вот так:
Form1 ...{  static int aaa = vkСode, static bool flag = true}...
timer ...{if (flag) this.label.text = aaa }...
И на этом все. то есть, я создал статическую переменную, запустил таймер и каждые 20 мс ищу флаг нажатия клавиши, если такой есть я сбрасываю флаг и печатаю переменную. С такой реализацией, правда не слишком изяшной, даже если программа находится не в фокусе, она успешно отображает буквы с клавиатуры. НО ЭТО ЧЕРЕЗ ПОСРЕДНИКА!!!  
Я предполагаю, что вы советуете как то создать статическую переменную которая сможет указывать напрямую на объект label.text.  
С официального сайта Microsoft в поддержку Net, там сказано создайте ссылку на объект, так как это статический метод, что то типа  {Form tempForm = new FormActivForm}. или типа того, однако такая реализация позволяет отлавливать данные с клавиатуры только если форма находится в фокусе, во всех других случаях она дает исключение. ТАК ЧТО ЭТОТ ВАРИАНТ ТОЖЕ НЕ ПОДХОДИТ!!!
Если не сложно и я правильно понял вашу мысль, бросьте от руки хотя бы пару строк кода, чтобы была ясна мысль как делается такая переменная, и с помощью нее вызывается объект this.label.text.  
Спасибо.
 
 

Всего записей: 3 | Зарегистр. 10-02-2011 | Отправлено: 09:08 17-02-2011 | Исправлено: leonidSDF, 10:07 17-02-2011
Omicron_Persey_8



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
giv5dot26
Уже хорошо. Осталось узнать, что за Exception выкидывается и примерно в каком месте. Я так полагаю, что в строке
Цитата:

Код:
DlgOpenFile.ShowDialog();
?

Всего записей: 282 | Зарегистр. 02-09-2007 | Отправлено: 10:02 17-02-2011
giv5dot26



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ээээмм... а что тут не так как считаете? вот такой код ведет себя так же:  

Код:
 
           try
            {
                DlgOpenFile.ShowDialog();
                y = DlgOpenFile.FileNames.Count() - 1;
            }
            catch (PlatformNotSupportedException ex)
            {
                MessageBox.Show(ex.Message);
                return;
            }            
            if (!FileOpened)
                return;
            if (y >= 18)
            {
                MessageBox.Show("Нужно выбрать не более 18 файлов!");
                FileOpened = false;
                return;
            }
            for (x = 0; x <= y; x++)
            {
                Foo(DlgOpenFile.FileNames[x]);
            }
 

Всего записей: 302 | Зарегистр. 25-07-2007 | Отправлено: 11:42 17-02-2011 | Исправлено: giv5dot26, 11:48 17-02-2011
Omicron_Persey_8



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
giv5dot26
То есть падает все-таки на  DlgOpenFile.ShowDialog() ???
А на какой версии .NET Framework запускаете?

Всего записей: 282 | Зарегистр. 02-09-2007 | Отправлено: 13:06 17-02-2011
giv5dot26



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Omicron_Persey_8
Вроде выяснил что это происходит из-за отсутствия .net framework 3.5, вот только каким исключением это отловить?

Всего записей: 302 | Зарегистр. 25-07-2007 | Отправлено: 04:06 18-02-2011
Mextrom



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
giv5dot26

Цитата:
вот только каким исключением это отловить?

Можно в нужное место поставить
Код:
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
тогда отлавливаться будут все исключения. Текст ошибки приведите.

Всего записей: 854 | Зарегистр. 30-03-2005 | Отправлено: 09:06 18-02-2011
giv5dot26



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Решил не париться, все равно нужен .net framework так что смысла извращаться нет. Вставил как вы на писали Mextrom, ноничего не происходит вываливается ошибка времени исполнения.

Всего записей: 302 | Зарегистр. 25-07-2007 | Отправлено: 09:54 18-02-2011
Mextrom



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
giv5dot26
Я не могу понять, если у вас не установлен framework, то как у вас вообще приложение  компилируется?
блоки try-catch как раз и отлавливают ошибки времени исполнения, может быть, ошибка вылетает не там, где вы предполагаете? Возможно, у вас ошибка вываливается не во время работы диалога, а уже во время открытия файла? Без текста сообщения об ошибке можно только гадать.

Всего записей: 854 | Зарегистр. 30-03-2005 | Отправлено: 10:14 18-02-2011
Omicron_Persey_8



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mextrom

Цитата:
Я не могу понять, если у вас не установлен framework, то как у вас вообще приложение  компилируется?

Там косяк в том, что в семерке стоит одна версия Framework'а, а в XP - другая. Плюс ко всему, начиная с .Net Framework 3.0 классов OpenFileDialog стало два: один в System.Windows.Forms, который (если верить MSDN) работрает везде, где есть .NET, и второй, в Microsoft.Win32, который работает в винде, начиная с WinXP SP2. Я с подобным косяком сталкивался один раз, когда пытался WinAPI CodePack запустить на XP. Он у меня не мог какую функцию WinAPI вызвать, связанную с получением абсолютного пути к папке по обобщенному имени, типа ("Изображения" или "Мои документы") для текущего пользователя.

Всего записей: 282 | Зарегистр. 02-09-2007 | Отправлено: 10:47 18-02-2011
giv5dot26



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Omicron_Persey_8 прав ибо класс OpenFileDialog отличаются в 2.0 и 3.5 версиях. .net framework не был установлен на одной из машин на которых я протестил свое приложение.

Всего записей: 302 | Зарегистр. 25-07-2007 | Отправлено: 10:51 18-02-2011
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Программирование в среде .NET (ASP.NET,ADO.NET) на C#/VB.NET


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru