OneNote продолжает скрывать мою кнопку плагинов - PullRequest
0 голосов
/ 25 октября 2010

Я создал кнопку на панели инструментов в OneNote, как Даниэль Эскапа показал . Обычно это работает, но иногда OneNote решает выделить кнопку на панели инструментов серым цветом, что делает невозможным ее нажатие. Я не могу понять, в каком состоянии это происходит. Как я могу предотвратить это?

Я осторожно возвращаю true из обработчиков OnEvent и OnClick, но, может быть, есть особый случай, который заставляет его возвращать false? Вот мой код:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OneNoteAddin;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.IO;
using OneNote = Microsoft.Office.Interop.OneNote;

namespace NoteTakerPlugin
{

    [Guid("792d0410-d53c-402d-92c9-5db9ea29f644")]
    public class NoteTakerButton : IOneNoteAddIn 
    {
        // for sending messages to window handles
        private struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }

        // this should be hardcoded in the note taker application
        private const string NoteTakerAppClassName = "CubicNoteTaker-792d0410-d53c-402d-92c9-5db9ea29f644::EventReceiver";

        private const int WM_COPYDATA = 0x4A;

        [DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)]
        static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);

        IntPtr app;

        public NoteTakerButton()
        {
            tellAppSomething("{ \"appStart\": true }", false);
        }

        public bool OnClick([In] String strActivePageID)
        {
            // send the click event to the note taker app
            tellAppSomething("{ \"click\": { \"pageId\": \"" + strActivePageID + "\" }}", true);
            return true;
        }

        public bool OnEvent([In] OneNote.OneNoteAddIn_Event evt, [In] String strParameter)
        {
            // send the event to the note taker app
            tellAppSomething("{ \"event\": { \"id\": " + (int)evt + ", \"param\": \"" + strParameter + "\" }}", false);
            return true;
        }

        private void tellAppSomething(String message, bool startProgram)
        {
            // if the process is running
            refreshAppStatus();
            if( app != IntPtr.Zero  )
            {
                // send a window message to the process telling it the message
                sendMessageTo(app, message);
            }
            else if( startProgram )
            {
                // start the process with a command line telling it the message
                startApp(message);
            }
        }

        private void refreshAppStatus()
        {
            app = FindWindowByCaption(IntPtr.Zero, NoteTakerAppClassName);
        }

        private void sendMessageTo(IntPtr hWnd, String msg)
        {
            int wParam = 0;
            int result = 0;

            if (hWnd != IntPtr.Zero )
            {
                byte[] sarr = System.Text.Encoding.Default.GetBytes(msg);
                int len = sarr.Length;
                COPYDATASTRUCT cds;
                cds.dwData = IntPtr.Zero;
                cds.lpData = msg;
                cds.cbData = len + 1;
                result = SendMessage(hWnd, WM_COPYDATA, wParam, ref cds);
            }
        }

        private void startApp(String args)
        {
            string exe = getAppExe();
            if (File.Exists(exe))
            {
                System.Diagnostics.Process.Start(exe, args);
            }
            else
            {
                System.Windows.Forms.MessageBox.Show("You need to reinstall the Note Taker application. The installation is corrupted.");
            }
        }

        private string getAppExe()
        {
            // use the registry to find where the application is installed
            RegistryKey noteTakerKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\NoteTaker");
            String path = noteTakerKey.GetValue("Path","").ToString();
            String exe = noteTakerKey.GetValue("Exe", "").ToString();

            if (!Directory.Exists(path))
                return "";

            String combo = Path.Combine(path, exe);

            if( File.Exists(combo) )
                return combo;
            else // not installed
                return ""; 
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 27 октября 2010

В свойствах моего проекта на вкладке «Сборка» я забыл проверить «Зарегистрироваться для взаимодействия с COM» в режиме выпуска.Это вызвало периодические ошибки.

0 голосов
/ 25 октября 2010

РЕДАКТИРОВАТЬ: Я помню эту проблему, сейчас!Когда вы закрываете OneNote, проверяете, запущен ли его экземпляр в Taskman, я думаю, что этот тип блокирует надстройку в будущих экземплярах и отключает их, убедитесь, что у вас не осталось ни одного запущенного кода, который заставил бы экземпляр остатьсяжив.

...