Перехват сообщений в системе - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Столкнулся с проблеммой получения данных с буфера обмена. Но обо всём по порядку. - Необходимо при нажатии 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);
------------------ На данной строке IDataObject iData = Clipboard.GetDataObject(); выходит сообщение об ошибки "В экземпляре объекта не задана ссылка на объект." Точно уверен, что в буфере обмена содержится данные в формате текст. Странно выходит, если я делаю Clipboard.GetDataObject() на кнопке, то всё отображается верно(приведено ниже)! Но мне нужно, чтобы это действие выполнялось на сочетании клавиш CTRL+C.
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;
            }
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы