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...
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ł.
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);
}
}
@furious programming @kAzek dziękuję za odpowiedź.