1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
1

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

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

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

Что такое "bool " и #include <algorithm>? Кто знает , как они работают ?
Вот код: #include &quot;stdafx.h&quot; #include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;conio.h&gt; ...

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их...

Что делать если пишет такое "Не удается преобразовать из "int" в "System.IntPtr"."
Всем привет, столкнулся с тем, что пишет (Не удается преобразовать из &quot;int&quot; в &quot;System.IntPtr&quot;.)...

Давайте обсудим такое явление как "социльная проституция". Что это такое и как с ней бороться
В чём причины этого явления? Добавлено через 5 минут И что более аморально: реальная...

10
349 / 262 / 65
Регистрация: 07.04.2014
Сообщений: 1,603
31.05.2014, 22:32 2
Для программы необходимо
А, Вы точно уверены, что нужен именно хук? Может быть, проблему можно решить проще?
Изложите проблему подробнее.
0
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
31.05.2014, 22:36  [ТС] 3
Я хочу написать программу, которая будет вести учёт записей буфера обмена, хранить их при необходимости и вообще, чтобы можно выбирать больше одного скопированного файла или текста, как в ворде...
0
Ушел с форума
Эксперт С++
16468 / 7432 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
31.05.2014, 22:46 4
А при чем здесь хуки вообще ? То, что Вам нужно, называется 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  [ТС] 5
Спасибо, но опять же, там всё на английском, а я его не знаю... Не хочется тупо копировать код, хочется понять его, а я вообще ничего не понимаю...
0
Ушел с форума
Эксперт С++
16468 / 7432 / 1186
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
31.05.2014, 23:00 6
Цитата Сообщение от Алькорище Посмотреть сообщение
там всё на английском, а я его не знаю.
Есть программы-переводчики. Было бы желание, как говорится.
0
Почетный модератор
Эксперт .NET
8717 / 3669 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.06.2014, 02:08 7
Лучший ответ Сообщение было отмечено 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  [ТС] 8
Хорошо, спасибо, буду разбирать
0
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
08.06.2014, 21:54  [ТС] 9
Извините за долгое отсутствие! Появились вопросы... Для начала скажу, что C# я пока ещё изучаю а с WPF ещё не сталкивался, но вот мой первый вопрос, system.Windows.Interop - как переписать это пространство под WinForms?
0
Почетный модератор
Эксперт .NET
8717 / 3669 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
08.06.2014, 22:40 10
Лучший ответ Сообщение было отмечено Алькорище как решение

Решение

Кривовато получилось (избыточность, в WPF красивее), но там уже сами переделаете нормально.
Вложения
Тип файла: rar ClipboardViewerWF.rar (10.8 Кб, 36 просмотров)
1
1 / 1 / 0
Регистрация: 13.03.2014
Сообщений: 53
08.06.2014, 23:34  [ТС] 11
Ого! Спасибо большое ! DD
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2014, 23:34
Помогаю со студенческими работами здесь

Как работают команды "String", "Unstring", "Pointer" с большими переменными?
Привет. Я начинающий программист в Cobol. У меня такой вопрос: мне нужно протестировать как...

Небольшой блиц на тему "что такое флэш" или "вопросы от самых маленьких"))
Хочу начать изучение Flash (нужно создать сайт с использованием flash + MySQL) (ЗЫ. PHP и MySQL...

Что такое "указатель сообщения"? Что за "специальное слово"?
Э.Таненбаум &quot;Современные операционные системы&quot; 2-е издание, Питер, 2006. Стр.113:Что такое...

Что такое "Модуль" и "Форма" и чем они отличаются
Вот в этой теме: https://www.cyberforum.ru/visual-basic/thread629680.html в самом низу раптор дал...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru