Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 2

Расширение возможностей буфера обмена

19.12.2021, 13:02. Показов 712. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Нашёл в интернете код для расширения возможностей буфера обмена, но не могу понять по какой причине он не работает. https://www.codeguru.com/dotne... rd-in-net/.

Сам код:
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
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
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
 
namespace syspr_project
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private int intChannel = 1;
        private object[] objData = new object[5];
        private ClipboardDataType[] cdtType = new ClipboardDataType[5];
 
        private enum ClipboardDataType
        {
            Empty,
            Text,
            Image,
            Audio,
            FileList
        }
 
        [System.Runtime.InteropServices.DllImport("user32")]
        private static extern int RegisterHotKey(IntPtr hwnd, int id,
            int fsModifiers, int vk);
        [System.Runtime.InteropServices.DllImport("user32")]
        private static extern int UnregisterHotKey(IntPtr hwnd, int id);
        [System.Runtime.InteropServices.DllImport("kernel32")]
        private static extern short GlobalAddAtom(string lpString);
        [System.Runtime.InteropServices.DllImport("kernel32")]
        private static extern short GlobalDeleteAtom(short nAtom);
 
        private const int MOD_CONTROL = 2;
 
        private short[] stKeyID = new short[5];
 
        private Keys[] kKeyValue = new[] { Keys.D1, Keys.D2, Keys.D3,
      Keys.D4, Keys.D5 };
        public void RegisterGlobalHotKey(int intID)
        {
            try
            {
                Keys kKey = kKeyValue[intID];
                int intModifier = MOD_CONTROL;
 
                string strName = Thread.CurrentThread.ManagedThreadId
                   .ToString("X8") + this.Name + intID;
                stKeyID[intID] = GlobalAddAtom(strName);
                if (stKeyID[intID] == 0)
                    throw new Exception("Error");
                if (RegisterHotKey(this.Handle, stKeyID[intID],
                      intModifier, System.Convert.ToInt32(kKey)) == 0)
                    throw new Exception("Error");
            }
            catch (Exception ex)
            {
                UnregisterGlobalHotKey();
            }
 
        }
 
        public void UnregisterGlobalHotKey()
        {
            for (int i = 0; i <= stKeyID.Length - 1; i++)
            {
                if (stKeyID[i] != 0)
                {
                    UnregisterHotKey(this.Handle, stKeyID[i]);
                    GlobalDeleteAtom(stKeyID[i]);
                    stKeyID[i] = 0;
                }
            }
        }
 
        protected override void WndProc(ref Message mes)
        {
            base.WndProc(ref mes);
            const int WM_HOTKEY = 0x312;
            if (mes.Msg == WM_HOTKEY)
            {
                for (int i = 0; i <= stKeyID.Length - 1; i++)
                {
                    if (mes.WParam.Equals(stKeyID[i]))
                        Swap(i);
                }
            }
        }
        private void Swap(int iChannel)
        {
            if (Clipboard.ContainsText())
            {
                objData[intChannel] = Clipboard.GetText();
                cdtType[intChannel] = ClipboardDataType.Text;
            }
            else if (Clipboard.ContainsImage())
            {
                objData[intChannel] = Clipboard.GetImage();
                cdtType[intChannel] = ClipboardDataType.Image;
            }
            else if (Clipboard.ContainsAudio())
            {
                objData[intChannel] = Clipboard.GetAudioStream();
                cdtType[intChannel] = ClipboardDataType.Audio;
            }
            else if (Clipboard.ContainsFileDropList())
            {
                objData[intChannel] = Clipboard.GetFileDropList();
                cdtType[intChannel] = ClipboardDataType.FileList;
            }
            else
            {
                objData[intChannel] = null;
                cdtType[intChannel] = ClipboardDataType.Empty;
            }
            intChannel = iChannel;
            switch (cdtType[intChannel])
            {
                case ClipboardDataType.Text:
                    {
                        Clipboard.SetText((string)objData[intChannel]);
                        break;
                    }
                case ClipboardDataType.Image:
                    {
                        Clipboard.SetImage((Image)objData[intChannel]);
                        break;
                    }
                case ClipboardDataType.FileList:
                    {
                        Clipboard.SetFileDropList((System.Collections
                           .Specialized.StringCollection)objData
                           [intChannel]);
                        break;
                    }
                case ClipboardDataType.Audio:
                    {
                        Clipboard.SetAudio((System.IO.Stream)objData
                           [intChannel]);
                        break;
                    }
                case ClipboardDataType.Empty:
                    {
                        Clipboard.Clear();
                        break;
                    }
            }
        }
 
        public void RegisterAllKeys()
        {
            for (int i = 0; i <= stKeyID.Length - 1; i++)
                RegisterGlobalHotKey(i);
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            RegisterAllKeys();
        }
 
        private void Form1_FormClosed(object sender,
           FormClosedEventArgs e)
        {
            UnregisterGlobalHotKey();
        }
 
 
    }
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2021, 13:02
Ответы с готовыми решениями:

Мониторинг буфера обмена
Хотел написать программу на C#, которая следила бы за буфером обмена. Проверяла через 1 - 3 секунды содержимое и добавляло в...

Не работает замена из буфера обмена
Привет всем! Проблема в том, что прога должна искать схожее значение, и если найдет- оно меняется на указанное мною. При запуске...

Вставка рисунка в Excel из буфера обмена
Доброго ситуация такая, надо загнать изображение в буфер, а потом в цикле пробежаться по всем листам книги Excel и вставлять данный...

2
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
19.12.2021, 15:04
Лучший ответ Сообщение было отмечено canibite как решение

Решение

canibite, есть такое выражение "обезьяна с гранатой". Важно держать это в голове, читая далее.

Начну с небольшого отступления. В Windows есть сочетание клавиш Win + V, которое имеет два несомненных преимуществ: не надо ничего устанавливать сомнительного качества, не использует глобальный хук.

Если мозг размером с грецкий орех, то никакой pinvoke не поможет:
C#
1
2
3
4
5
6
7
8
9
10
11
[System.Runtime.InteropServices.DllImport("user32")]
private static extern int RegisterHotKey(IntPtr hwnd, int id, int fsModifiers, int vk);
 
[System.Runtime.InteropServices.DllImport("user32")]
private static extern int UnregisterHotKey(IntPtr hwnd, int id);
 
[System.Runtime.InteropServices.DllImport("kernel32")]
private static extern short GlobalAddAtom(string lpString);
 
[System.Runtime.InteropServices.DllImport("kernel32")]
private static extern short GlobalDeleteAtom(short nAtom);
Проблема в том, что если не завершить корректно выполнение программы, то этот глобальный хук продолжит висеть, проверять я этого, конечно, не хочу. Но это не главная проблема, хук обрабатывается только в своем окне, но блокирует сочетание кнопок для всех окон, даже чужих (мой браузер например):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
protected override void WndProc(ref Message mes)
{
    base.WndProc(ref mes);
    const int WM_HOTKEY = 0x312;
    if (mes.Msg == WM_HOTKEY)
    {
        for (int i = 0; i <= stKeyID.Length - 1; i++)
        {
            if (mes.WParam.Equals(stKeyID[i]))
                Swap(i);
        }
    }
}
Ок, допустим, мы не на столько глупые как хлебушек и так и хотели (читай, знаем, что творим), но:

1. Зачем перебивать важные кнопки?
C#
1
2
3
4
5
private Keys[] kKeyValue = new[]
{
    Keys.D1, Keys.D2, Keys.D3,
    Keys.D4, Keys.D5
};
2. Далее идет вовсе говнокод. Я, глядя на kKeyValue, ожидаю, что все будет работать, если я нажму клавишу D1, но ожидается Ctrl + D1:
C#
1
int intModifier = MOD_CONTROL;
3. Очень плохая идея вызывать какие-то методы в WndProc или вовсе делать циклы. Очень плохая практика вообще знать про существование этого метода.

4. Далее идет код в духе "я здесь король":
C#
1
if (mes.WParam.Equals(stKeyID[i]))
Проблема в том, что WParam - это индентификатор хоткея и это нефига не short, а IntPtr. Что такое вообще stKeyID? ID состояния кнопки? Что это вообще такое?

5. Метод Swap я не смотрел, но беглый взгляд говорит, что у автора беды с головой. Я даже не знаю с чего начать, чтобы описать, чем этот метод плох.
1
0 / 0 / 0
Регистрация: 08.06.2021
Сообщений: 2
20.12.2021, 10:32  [ТС]
Спасибо за подробный ответ
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.12.2021, 10:32
Помогаю со студенческими работами здесь

Как получить текст из буфера обмена?
Господа и Дамы программисты, кто подскажет как средствами С# получить текст из буфера обмена? А еще лучше выделенный текст из любого...

Как получить изображение с буфера обмена
вообще хочу сделать такую штуку,нажимаю принтскрин и вставку изображения в форме,сначала изображение помещается в буфер обмена,как вообще...

Математические операции с данными из буфера обмена
Здравствуйте Уважаемые програмисты! Понадобилась программа которая бы при копирывании выражения , например 2+2 3-1, находила сумму...

Урок: Копировать текст из буфера обмена
Всем привет, решил поделиться небольшой реализаций копирования текста из буфера обмена например в textBox! private void...

Вставка содержимого буфера обмена в textbox
DllImport(&quot;user32.dll&quot;, SetLastError = true)] private static extern void keybd_event(byte bVk, byte bScan, uint dwFlags, int...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru