Использование SendMessage () для записи в Excel в C # - PullRequest
0 голосов
/ 27 февраля 2019

Я сделал перед программой, в которой я мог открыть процесс блокнота и, пока он открыл , я мог писать в нем из консоли программы C #.Теперь я пытаюсь сделать то же самое, но с помощью Excel я могу запустить процесс, я могу открыть его и убить.Но когда я пытаюсь записать это с помощью метода SendMessage (), ничего не происходит, есть ли способ сделать это?Или я что-то упустил?Спасибо!

Вот что я пробовал до сих пор

Объявления

 [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern bool PostMessage(HandleRef hWnd, uint Msg, IntPtr wParam, IntPtr lParam);

    //include SendMessage
    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, int lParam);


    [DllImport("user32.dll", SetLastError = true)]
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);

    [DllImport("User32.dll")]
    static extern int SetForegroundWindow(IntPtr point);

    [DllImport("User32.dll", EntryPoint = "SendMessage")]
    extern static int SendMessageGetTextLength(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

    const uint WM_PASTE = 0x302;
    const int WM_SETTEXT = 0X000C;
    const int WM_GETTEXTLENGTH = 0x000E;
    const int EM_SETSEL = 0x00B1;
    const int EM_REPLACESEL = 0x00C2;

    static void Main(string[] args)
    {
        //Abre o programa
        Process prcss = new Process();
        prcss.StartInfo.FileName = "excel.exe";
        prcss.Start();
        string aux = prcss.StartInfo.FileName;

        //Verifica se o processo está a correr
        Process[] processlist = Process.GetProcesses();

Код для записи в него с помощью SendMessage ().

case "2":

                while (true)
                {

                    //Testar com o SendMessage
                    Console.WriteLine("\nTexto: \n");
                    string texto = Console.ReadLine();

                    if (aux.Length == 0)
                    {
                        return;
                    }

                    if (prcss != null)
                    {
                        IntPtr notepadTextbox = FindWindowEx(prcss.MainWindowHandle, IntPtr.Zero, "edit", null);
                        int length = SendMessageGetTextLength(notepadTextbox, WM_GETTEXTLENGTH, IntPtr.Zero, IntPtr.Zero);

                        if (!notepadTextbox.Equals(IntPtr.Zero))
                        {
                            //sending the message to the textbox
                            SendMessage(notepadTextbox, WM_SETTEXT, 0, texto);
                            SendMessage(notepadTextbox, EM_SETSEL, length, length);
                            SendMessage(notepadTextbox, EM_REPLACESEL, 1, texto + "\n");

                        }
                    }

                    Console.WriteLine("Sair? (S)im / (N)ão");
                    sair = Console.ReadLine();

                    if (sair == "s" || sair == "S")
                    {
                        IntPtr k = prcss.MainWindowHandle;
                        SetForegroundWindow(k);
                        prcss.Kill();
                        break;
                    }
                }
...