Перехват сообщений в системе - C#
Формулировка задачи:
Здравствуйте! Столкнулся с проблеммой получения данных с буфера обмена. Но обо всём по порядку.
- Необходимо при нажатии CTRL+C, перехватывать событие в программе. Затем обращаться к буферу обмена и вытягивать инфу в формате текст.
- вот что мне удалось сделать:
------------------
На данной строке IDataObject iData = Clipboard.GetDataObject(); выходит сообщение об ошибки
"В экземпляре объекта не задана ссылка на объект."
Точно уверен, что в буфере обмена содержится данные в формате текст. Странно выходит, если я делаю Clipboard.GetDataObject() на кнопке, то всё отображается верно(приведено ниже)! Но мне нужно, чтобы это действие выполнялось на сочетании клавиш CTRL+C.
public Form1() { InitializeComponent(); MethodInvoker mi = new MethodInvoker(WaitKey); mi.BeginInvoke(null, null); } private void WaitKey() { while (this.IsHandleCreated) { short res1 = GetAsyncKeyState(VK_CTRL); short res2 = GetAsyncKeyState(VK_C); if (res1!= 0 && res2!= 0) { IDataObject iData = Clipboard.GetDataObject(); ----////// тут происходит ошибка "В экземпляре объекта не задана ссылка на объект." if (iData.GetDataPresent(DataFormats.Text)) ; { textBox1.Text = (String)iData.GetData(DataFormats.Text); //показываем текущий текст в буфере обмена } } } } public const int VK_CTRL = 0x11; public const int VK_C = 0x43; [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)] internal static extern short GetAsyncKeyState(int vkey);
private void button1_Click(object sender, EventArgs e) { IDataObject iData = Clipboard.GetDataObject(); if (iData.GetDataPresent(DataFormats.Text)) { textBox1.Text = (String)iData.GetData(DataFormats.Text); } }
Решение задачи: «Перехват сообщений в системе»
textual
Листинг программы
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; namespace MyHook { public partial class Form1 : Form { public Form1() { InitializeComponent(); Hook.StartHook(); Hook.lb = label1; Hook.lb.TextChanged += new System.EventHandler(this.lb_TextChanged); } private void lb_TextChanged(object sender, EventArgs e) { switch (Hook.lb.Text) { case "1": label2.Text = "Opa"; Hook.lb.ResetText(); Console.Beep(500, 100); break; case "2": label2.Text = "Огого"; Hook.lb.ResetText(); Console.Beep(1000, 100); break; } } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д