Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53

Что такое "хук" в C# и как с ним работают?

31.05.2014, 22:23. Показов 3480. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что такое "хук" в C# и как с ним работают? Для программы необходимо, по советам с форумов, либо писать под C# но с хуками, либо надо WinAPI, а т.к. в WinAPI я вообще не хочу лезть, не изучив толком среду .NET, прошу помощи. В связи с тем, что про хуки я вообще ничего не знаю, искал информацию про них в интернете, но, судя по всему объяснение есть только на англоязычных источниках, а английского, простите, я не знаю! Прошу помощи: расскажите от себя про эти "хуки" или дайте ссылку, которую я проглядел, на русскоязычный источник, на котором мне так же смогут всё объяснить... Ещё раз прошу помощи! Спасибо...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.05.2014, 22:23
Ответы с готовыми решениями:

Что такое хук и как он работает ?
Мне не нужны примеры создания хуков(они у меня есть) я хочу узнать как они работают, их принцып действия(пока я смутно представляю что это...

Что такое SDK и как с ним работать?
1) что такое вообще SDK для IP камер: что-то вроде получение доступа (полномочий) к настройкам или какое-то ПО для получения этого доступа...

Что такое флаг и как с ним работать?
нужно эту прогу переделать так чтобы обьеденить if(i%2==0) и if(i%2==1), с помощью флагов. Подскажите что нужно сделать! #include...

10
349 / 262 / 65
Регистрация: 07.04.2014
Сообщений: 1,603
31.05.2014, 22:32
Для программы необходимо
А, Вы точно уверены, что нужен именно хук? Может быть, проблему можно решить проще?
Изложите проблему подробнее.
0
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
31.05.2014, 22:36  [ТС]
Я хочу написать программу, которая будет вести учёт записей буфера обмена, хранить их при необходимости и вообще, чтобы можно выбирать больше одного скопированного файла или текста, как в ворде...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
31.05.2014, 22:46
А при чем здесь хуки вообще ? То, что Вам нужно, называется clipboard viewer и
делается штатными средствами Windows (см. функцию SetClipboardViewer).
Для .NET нетрудно написать соответствующий класс, вот есть пример:

ClipSpy+
http://www.codeproject.com/Articles/22624/ClipSpy
0
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
31.05.2014, 22:52  [ТС]
Спасибо, но опять же, там всё на английском, а я его не знаю... Не хочется тупо копировать код, хочется понять его, а я вообще ничего не понимаю...
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
31.05.2014, 23:00
Цитата Сообщение от Алькорище Посмотреть сообщение
там всё на английском, а я его не знаю.
Есть программы-переводчики. Было бы желание, как говорится.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.06.2014, 02:08
Лучший ответ Сообщение было отмечено NickoTin как решение

Решение

Когда-то писал вот такие классы для слежения за буфером обмена (писалось для WPF, давно, возможны ляпы, выдрано из проекта).
Основной класс ClipboardViewer.cs, всё остальное внутренняя реализация под определенную ОС (SetClipboardViewer is used for backward compatibility with earlier versions of Windows via MSDN, потому с разделением на ОС).

Source

User32.cs
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
using System;
using System.Runtime.InteropServices;
 
namespace CommonData.PInvoke
{
    internal static class User32
    {
        public const string DllName = "user32.dll";
 
        #region ~ Clipboard ~
 
        public const int WM_CLIPBOARDUPDATE = 0x031D;
 
        [DllImport( DllName, SetLastError = true )]
        public static extern bool AddClipboardFormatListener (
            IntPtr hwnd
            );
 
        [DllImport( DllName, SetLastError = true )]
        public static extern bool RemoveClipboardFormatListener (
            IntPtr hwnd
            );
 
        public const int WM_DRAWCLIPBOARD = 0x0308;
        public const int WM_CHANGECBCHAIN = 0x030D;
 
        [DllImport( DllName, SetLastError = true )]
        public static extern IntPtr SetClipboardViewer (
            IntPtr hWndNewViewer
            );
 
        [DllImport( DllName, SetLastError = true )]
        public static extern bool ChangeClipboardChain (
            IntPtr hWndRemove,
            IntPtr hWndNewNext
            );
 
 
        #endregion
 
        [DllImport( DllName, SetLastError = true, CharSet = CharSet.Unicode )]
        public static extern IntPtr SendMessage (
            IntPtr hWnd,
            int uMsg,
            IntPtr wParam,
            IntPtr lParam
            );
    }
}
BaseClipboardViewer.cs
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
using System;
using System.Windows.Interop;
 
namespace TorrentDownloader.Clipboard
{
    internal sealed partial class ClipboardViewer
    {
        private abstract class BaseClipboardViewer : IDisposable
        {
            protected BaseClipboardViewer ( HwndSource hwndSource, Action<BaseClipboardViewer> clipboardChangedCallback )
            {
                mCallback = clipboardChangedCallback;
                mHwndSource = hwndSource;
                mHwndSource.AddHook( WndProc );
            }
 
            #region ~ Properties ~
 
            public IntPtr HWnd
            {
                get
                {
                    return mHwndSource == null ? IntPtr.Zero : mHwndSource.Handle;
                }
            }
 
            #endregion
 
            #region ~ Methods ~
 
            protected abstract IntPtr WndProc ( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled );
 
            protected void OnClipboardChanged ( BaseClipboardViewer clipboardViewer )
            {
                mCallback( clipboardViewer );
            }
 
            public virtual void Dispose ( )
            {
                mHwndSource.RemoveHook( WndProc );
                mHwndSource.Dispose();
                mHwndSource = null;
            }
 
            #endregion
 
            #region ~ Fields ~
 
            private HwndSource mHwndSource;
            private Action<BaseClipboardViewer> mCallback;
 
            #endregion
        }
    }
}
XPClipboardViewer.cs
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
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Interop;
using CommonData.PInvoke;
 
namespace TorrentDownloader.Clipboard
{
    internal sealed partial class ClipboardViewer
    {
        private sealed class XPClipboardViewer : BaseClipboardViewer
        {
            public XPClipboardViewer ( HwndSource hwndSource, Action<BaseClipboardViewer> clipboardChangedCallback )
                : base( hwndSource, clipboardChangedCallback )
            {
                mNextWindow = User32.SetClipboardViewer( HWnd );
 
                if ( mNextWindow == IntPtr.Zero )
                {
                    Dispose();
                    throw new Win32Exception( Marshal.GetLastWin32Error(), "Не удалось зарегистрировать перехватчик буфера обмена." );
                }
            }
 
            protected override IntPtr WndProc ( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled )
            {
                switch ( msg )
                {
                case (User32.WM_CHANGECBCHAIN):
                    if ( wParam == mNextWindow )
                        mNextWindow = lParam;
                    else if ( mNextWindow != IntPtr.Zero )
                        User32.SendMessage( mNextWindow, msg, wParam, lParam );
 
                    handled = true;
                    break;
                case (User32.WM_DRAWCLIPBOARD):
                    OnClipboardChanged( this );
                    User32.SendMessage( mNextWindow, msg, wParam, lParam );
                    handled = true;
                    break;
                }
 
                return IntPtr.Zero;
            }
 
            public override void Dispose ( )
            {
                if ( mNextWindow != IntPtr.Zero )
                {
                    User32.ChangeClipboardChain( HWnd, mNextWindow );
                    mNextWindow = IntPtr.Zero;
                }
                base.Dispose();
            }
 
            #region ~ Fields ~
 
            private IntPtr mNextWindow;
 
            #endregion
        }
    }
}
VistaClipboardViewer.cs
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
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Windows.Interop;
using CommonData.PInvoke;
 
namespace TorrentDownloader.Clipboard
{
    internal sealed partial class ClipboardViewer
    {
        private sealed class VistaClipboardViewer : BaseClipboardViewer
        {
            public VistaClipboardViewer ( HwndSource hwndSource, Action<BaseClipboardViewer> clipboardChangedCallback )
                : base( hwndSource, clipboardChangedCallback )
            {
                if ( !(mIsRegistered = User32.AddClipboardFormatListener( HWnd )) )
                {
                    Dispose();
                    throw new Win32Exception( Marshal.GetLastWin32Error(), "Не удалось зарегистрировать перехватчик буфера обмена." );
                }
            }
 
            #region ~ Methods ~
 
            protected override IntPtr WndProc ( IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled )
            {
                switch ( msg )
                {
                case User32.WM_CLIPBOARDUPDATE:
                    OnClipboardChanged( this );
                    handled = true;
                    break;
                }
 
                return IntPtr.Zero;
            }
 
            public override void Dispose ( )
            {
                if ( mIsRegistered )
                {
                    mIsRegistered = !User32.RemoveClipboardFormatListener( HWnd );
                }
 
                base.Dispose();
            }
 
            #endregion
 
            #region ~ Fields ~
 
            private bool mIsRegistered;
 
            #endregion
        }
    }
}
ClipboardViewer.cs
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
using System;
using System.Windows;
using System.Windows.Interop;
using SysClipboard = System.Windows.Clipboard;
 
namespace TorrentDownloader.Clipboard
{
    internal sealed partial class ClipboardViewer : IDisposable
    {
        public ClipboardViewer ( HwndSource hwndSource )
        {
            if ( hwndSource == null )
                throw new ArgumentException( "hwndSource не может быть null!" );
 
            if ( Environment.OSVersion.Version >= new Version( 6, 0 ) )
                mClipboardViewer = new VistaClipboardViewer( hwndSource, OnClipboardChangedCallback );
            else
                mClipboardViewer = new XPClipboardViewer( hwndSource, OnClipboardChangedCallback );
        }
 
        #region ~ Events ~
 
        public event Action<string> ClipboardChanged;
 
        private void OnClipboardChanged ( string clipboardContent )
        {
            if ( ClipboardChanged != null )
                ClipboardChanged( clipboardContent );
        }
 
        #endregion
 
        #region ~ Properties ~
 
        public string LastClipboardString { get; private set; }
 
        #endregion
 
        #region ~ Methods ~
 
        private void OnClipboardChangedCallback ( BaseClipboardViewer clipboardViewer )
        {
            if ( SysClipboard.ContainsText() )
                OnClipboardChanged( LastClipboardString = SysClipboard.GetText() );
        }
 
        public void Dispose ( )
        {
            if ( mClipboardViewer != null )
            {
                mClipboardViewer.Dispose();
                mClipboardViewer = null;
            }
        }
 
        #endregion
 
        #region ~ Fields ~
 
        private BaseClipboardViewer mClipboardViewer;
 
        #endregion
    }
}


Переписать под WinForms не сложно, вроде только HwndSource на IntPtr заменить и убрать хвосты HwndSource.

Цитата Сообщение от Алькорище Посмотреть сообщение
Не хочется тупо копировать код, хочется понять его
Если так ничего и не начать делать, то так и не сдвинетесь с мертвой точки.
Задавайте конкретные вопросы, с фрагментами кода которые непонятны.
Вложения
Тип файла: zip ClipboardViewer.zip (3.6 Кб, 1772 просмотров)
2
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
01.06.2014, 21:29  [ТС]
Хорошо, спасибо, буду разбирать
0
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
08.06.2014, 21:54  [ТС]
Извините за долгое отсутствие! Появились вопросы... Для начала скажу, что C# я пока ещё изучаю а с WPF ещё не сталкивался, но вот мой первый вопрос, system.Windows.Interop - как переписать это пространство под WinForms?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8725 / 3677 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
08.06.2014, 22:40
Лучший ответ Сообщение было отмечено Алькорище как решение

Решение

Кривовато получилось (избыточность, в WPF красивее), но там уже сами переделаете нормально.
Вложения
Тип файла: rar ClipboardViewerWF.rar (10.8 Кб, 36 просмотров)
1
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
08.06.2014, 23:34  [ТС]
Ого! Спасибо большое ! DD
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.06.2014, 23:34
Помогаю со студенческими работами здесь

Что такое Snippet и как с ним работать?
Скажите пожалуйста , что это и зачем . Если можно ссылку , не могу найти подробного объяснения =(

Что такое Bitmap и как с ним работать
Мне нужно инвертировать изображение, оно помещается в Timage, и в любом формате, помогите, очень нужно.

Что такое render pipline и как с ним работать?
Я имею слабое представление о написании шейдеров и о самом процессе рендеринга. Хочется поработать с качеством картинки в игре. Что такое...

что такое Blob memo? и как с ним работать?
Здравствуйте! подскажите пожалуйста что такое Blob memo? в delphi вводим в memo текст, а в бд показывает Blob memo, как данные сохраняются,...

Объясните что такое fetch_assoc() и как с ним работать
При работе скрипта выходит ошибка: Неустранимая ошибка: вызов функции-члена fetch_assoc() на bool in /srv / disk19 / 3334503 / www /...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru