C # сделать калькулятор буфера обмена с уведомлением - PullRequest
0 голосов
/ 19 апреля 2019

это возможно, например, если вы копируете 2 + 2 на сайте. Что вы затем отправите это в буфер обмена и получите уведомление Windows с результатом 4?

теперь мне уже удалось, что вы можете добавлять суммы на основе списка с правильным ответом, но это неэффективно. Я просто хочу, чтобы ты сделал это простым способом. Кто-нибудь сможет мне помочь?

Это мой код.

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        //Invoke a clipboard monitor
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SetClipboardViewer(IntPtr hWndNewViewer);
        private IntPtr _ClipboardViewerNext;

       private void Form1_Load(object sender, EventArgs e)
        {
            //Set our application as a clipboard viewer
            _ClipboardViewerNext = SetClipboardViewer(Handle);

        }
        private void GetAnswer(string clipboardText)
        {
            //Loop through all questions and answers
            foreach (question q in questionList)
            {
                //If we have found an answer that is exactly the same show an Notification
                if (q._question == clipboardText)
                {
                    ShowNotification(q._question, q._answer);
                }
            }
        }

        private void ShowNotification(string question, string answer)
        {
            notifyIcon1.Icon = SystemIcons.Exclamation;
            notifyIcon1.BalloonTipTitle = question;
            notifyIcon1.BalloonTipText = answer;
            notifyIcon1.BalloonTipIcon = ToolTipIcon.Error;
            Clipboard.Clear();
        }

        protected override void WndProc(ref Message m)
        {
            base.WndProc(ref m);
            {
                const int WM_DRAWCLIPBOARD = 0x308;
                if (m.Msg == WM_DRAWCLIPBOARD)
                {
                    GetAnswer(Clipboard.GetText());
                }
            }
        }
    }
}

1 Ответ

0 голосов
/ 19 апреля 2019
private char[] SPACE = new char[] { ' ' };
private void GetAnswer(string clipboardText)
{
    var parts = clipboardText.Split(SPACE);
    var isValid = true;
    int a, b;

    // Make sure it's format A # B
    if (parts.Length != 3)
        return;

    // Parse first number
    isValid = int.TryParse(parts[0], out a);
    if (!isValid)
        return;

    var validOperators = new char[] { '+', '-', '/', '*' };

    // Parse operator
    if (parts[1].Length != 1)
        return;
    var op = parts[1][0];
    if (!validOperators.Contains(op))
        return;

    // Parse 2nd number
    isValid = int.TryParse(parts[2], out b);
    if (!isValid)
        return;

    // Now calculate the answer
    string answer = null;
    switch (op)
    {
        case '+':
            answer = (a + b).ToString();
            break;
        case '-':
            answer = (a - b).ToString();
            break;
        case '/':
            if (b == 0)
                answer = "NaN";
            else
                answer = (a / b).ToString();
            break;
        case '*':
            answer = (a * b).ToString();
            break;
        default:
            throw new InvalidOperationException();
    }

    // Show the answer
    ShowNotification(clipboardText, answer);
}
...