Win32 API’leri İle Dinamik Clipboard Dinleme

Merhaba,

Bir önceki Clipboard Sınıfı İle Not Panosu Kullanımı başlıklı yazımızda C# ile Clipboard sınıfının nasıl kullanıldığını incelemiş, Copy/Paste işlemine programatik olarak nasıl müdahale edildiğini incelemiştik. Bu içeriğimizde ise Win32 API’lerini kullanarak Clipboard üzerinde olan anlık değişimleri dinamik bir şekilde takip edecek ve bunları raporlayacağız.

İlk olarak kullanacağımız Win32 API’lerini extern ederek başlayalım.

        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SetClipboardViewer(IntPtr hWnd);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

Ardından Clipboard nesnesindeki veriyi tutacak referansı global bir şekilde tanımlayalım.

        IntPtr SonrakiClipboard;

Bu işlemden sonra “SonrakiClipboard” referansımıza “User32.dll” kütüphanesinden extern ettiğimiz “SetClipboardViewer” metodu neticesinde gelen veriyi atamalıyız. Tabi bu işlemi projenize göre uygun bir yerde yapabileceğiniz gibi ben şimdilik örnek Windows Form uygulamasında anlatım sergilediğim için Form_Load eventında bu işlemi gerçekleştireceğim.

        private void Form1_Load(object sender, EventArgs e)
        {
            SonrakiClipboard = SetClipboardViewer(this.Handle);
        }

Şimdi sıra, işletim sisteminin programa yolladığı mesajları almak için tasarlanmış olan WndProc metodunu override etmeye geldi.

        protected override void WndProc(ref Message m)
        {
            int WM_DRAWCLIPBOARD = 0x0308;
            int WM_CHANGECBCHAIN = 0x030D;
            if (m.Msg == WM_DRAWCLIPBOARD)
            {
                ClipboardOku();
                SendMessage(SonrakiClipboard, m.Msg, m.WParam, m.LParam);
            }
            else if (m.Msg == WM_CHANGECBCHAIN)
            {
                if (m.WParam == SonrakiClipboard)
                    SonrakiClipboard = m.LParam;
                else
                    SendMessage(SonrakiClipboard, m.Msg, m.WParam, m.LParam);
            }
            base.WndProc(ref m);
        }
        private void ClipboardOku()
        {
            IDataObject dObj = Clipboard.GetDataObject();
            if (dObj.GetDataPresent(DataFormats.Text))
                textBox1.Text = (string)dObj.GetData(DataFormats.Text);
        }

Tüm bu işlemlerden sonra projemizi derleyip çalıştırdığımız zaman aşağıdaki videoda olduğu gibi bir çalışma söz konusu olacaktır.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

CAPTCHA (Şahıs Denetim Kodu) Resmi

*

Copy Protected by Chetan's WP-Copyprotect.