[ toxi_programer @ 05.06.2007. 21:14 ] @
Kako da proverim da li je nešto novo smešteno u clipboard? Ja sam probao da napravim f-ju koja će da se poziva svakih par sekundi i onda da u njoj proverim da li je stari objekat tipa DataObject razlicit od novog DataObject-a( ova dobijam preko klase Clipboard, funkcija GetData() ). Za tu proveru sam koristio Equal() funkciju tog objekta ali to poređenje uvek za rezultat daje false, odnosno da su različiti.
I onda ne znam kako da proverim dal' ima nešto novo u Clipboard-u...? Imali li neki event "OnClipboardUpdate" ? ;D
[ Pharos @ 06.06.2007. 09:23 ] @
Da odgovorim, pa ako nađeš nešto elegantnije, slobodno postuj.

Potrebno je da importuješ sledeće
Code:

using System.Runtime.InteropServices;

Ovo smestiš negde u klasi iznad konstruktora
Code:

[DllImport("User32.dll")]
protected static extern int SetClipboardViewer(int hWndNewViewer);

[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern bool ChangeClipboardChain(IntPtr hWndRemove, IntPtr hWndNewNext);

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

IntPtr nextClipboardViewer;


Ovo ubaciš u konstruktor
Code:

Clipboard.Clear();
nextClipboardViewer = (IntPtr)SetClipboardViewer((int)this.Handle);


Potrebno je override-ovati WndProc metodu
Code:

protected override void WndProc(ref System.Windows.Forms.Message m)
{
    // defined in winuser.h
    const int WM_DRAWCLIPBOARD = 0x308;
    const int WM_CHANGECBCHAIN = 0x030D;

    switch (m.Msg)
    {
        case WM_DRAWCLIPBOARD:
            DisplayClipboardData();
            SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
            break;

        case WM_CHANGECBCHAIN:
            if (m.WParam == nextClipboardViewer)
                nextClipboardViewer = m.LParam;
            else
                SendMessage(nextClipboardViewer, m.Msg, m.WParam, m.LParam);
            break;

        default:
            base.WndProc(ref m);
            break;
    }
}


I konačno metoda u kojoj radiš nešto kada dođe do promene u clipboard-u
Code:

void DisplayClipboardData()
{
    try
    {
        IDataObject iData = new DataObject();
        iData = Clipboard.GetDataObject();
        if (iData.GetDataPresent(DataFormats.Text))
        {
            // Ovde ide tvoj kod
        }
    }
    catch (Exception e)
    {
        MessageBox.Show(e.ToString());
    }
}


Kao što vidiš, nema tajmera i ostališ čudesa.
[ toxi_programer @ 06.06.2007. 15:14 ] @
Pharos bravo, super, extra! Hvala puno sto si odvojio vremena da mi odgovoriš, eto sad sam pametniji za jednu stvar :) Ću vidim dal ima još neki način za rešavanje ovog problem i ako nađem obavezno ću postavim...

Aj da ne otvaram novu temu za jedno kraće pitanje: Da li se može koristiti( i ako može kako ) atribut DllImport da bi se iz "uvezenog" dll deklarisao neki izvedeni tip podatka. Na primer, napišem neku klasu u C++u, kompajliram je u .dll i sad hoću da napravim instancu( objekat) te klase u C# jeziku. Probao sam ali mi javi grešku u fazonu "može samo funkcija da se deklariše, ne može objekat...". ???

Zanima me i ovo - gde mogu da nađem neku (e)knjigu koja "opisuje" Win32 funkcije? Sad ne znam dal' sam se lepo izrazio...
[ mmix @ 06.06.2007. 15:37 ] @
Citat:
toxi_programer:  Na primer, napišem neku klasu u C++u, kompajliram je u .dll i sad hoću da napravim instancu( objekat) te klase u C# jeziku. Probao sam ali mi javi grešku u fazonu "može samo funkcija da se deklariše, ne može objekat...". ???

Zanima me i ovo - gde mogu da nađem neku (e)knjigu koja "opisuje" Win32 funkcije? Sad ne znam dal' sam se lepo izrazio...


Knjiga:
Programming Windows, 5th Edition by Charles Petzold


Sto se tice C++ objekata, ne mozes ih koristiti direktno, jedino da ih wrappujes u managed extensions for C++.