Przechwytywanie wyrazu/zdania ze strony

0

Nie wiem jak się za to zabrać, tzn. nie wiem czy dało by się to w c#(ewentualnie python, jave wolałbym odpuścić) zrobić(fajnie by było). Chodzi o to, że chcę z jakiejkolwiek strony zaznaczając jakiś fragment tekstu, zapisywać go by potem wykorzystać go w swoim programie. Przykład(jak ja to widzę), zaznaczam wyraz -> PPM -> zapisz do schowka ->wyraz/zdanie pokazuje się w oknie mojego programu. Mozę ktoś mnie nakierować, bo serio jestem za tępy by znaleźć to w googlach...

4

Zobacz tutaj - How to monitor clipboard content changes in C#? Jak już schowek będzie posiadał dane tekstowe, to wystarczy je wykorzystać we własnym celu;


Teraz tak patrzę na ten kod w C# i trochę trzeba go naklepać; W powszechnie nielubianym Pascalu pod Delphi7 wystarczy do klasy formularza dodać poniższą metodę:

procedure ClipboardChanged(var AMessage: TMessage); message WM_DRAWCLIPBOARD;

ona będzie wywoływana przy globalnej zmianie zawartości schowka; Wystarczy w niej sprawdzić typ danych wrzuconych do schowka i gotowe:

procedure TMainForm.ClipboardChanged(var AMessage: TMessage);
begin
  if Clipboard.HasFormat(CF_TEXT) then
    { schowek zawiera tekst - można go użyć }
end;

Na koniec zarejestrować formularz jako "podglądacz" (np. w konstruktorze) i całość śmiga jak należy:

SetClipboardViewer(Self.Handle);

Ale to tak nawiasem pisząc, gdyby jakiś Pascalowiec tutaj przypadkiem trafił.

2

Tam tak naprawdę nie ma dużo kodu tylko to że trzeba samemu importować funkcje WinApi i z obsługi komunikatów wywoływane jest zdarzenie gdyby to sprowadzić do fragmentu który przedstawiłeś w Delphi to może być tylko (albo aż):

namespace ClipboardMonitorTest
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Clipbrd.AddClipboardFormatListener(this.Handle);
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            Clipbrd.RemoveClipboardFormatListener(this.Handle);
        }

        protected override void WndProc(ref Message m) //nadpisanie procedury obslugi komunikatow
        {
            base.WndProc(ref m); //odpowiednik inherited
            if (m.Msg == Clipbrd.WM_CLIPBOARDUPDATE)  //komunikat WM_CLIPBOARDUPDATE
            {
                IDataObject iData = Clipboard.GetDataObject(); //schowek
                if (iData.GetDataPresent(DataFormats.Text)) //HasFormat
                {
                    //schowek zawiera tekst - można go użyć 
                }    
            }
        }

    }

    public class Clipbrd //import funkcji schowka i stała komunikatu
    {
        const string User32 = "User32.dll";
        public const int WM_CLIPBOARDUPDATE = 0x031D;

        [DllImport(User32, CharSet = CharSet.Auto)]
        public static extern bool AddClipboardFormatListener(IntPtr hWndObserver);

        [DllImport(User32, CharSet = CharSet.Auto)]
        public static extern bool RemoveClipboardFormatListener(IntPtr hWndObserver);
    }

}
0

@furious programming @kAzek dziękuję za odpowiedź.

1 użytkowników online, w tym zalogowanych: 0, gości: 1