Перехват сообщений в системе - 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;
}
}
}
}