c #: «System.InvalidOperationException: Queue empty» и другие ошибки при использовании SendKey.SendWait () - PullRequest
2 голосов
/ 19 апреля 2011

Я написал программу для отправки ключа «Ввод» в определенное активное окно. Я использовал Таймер, чтобы получить заголовок активного окна на данный момент и действовать соответственно. Я сделал файл журнала ошибок, чтобы я мог отслеживать все ошибки. Вот код, который создает ошибку:

    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
        try
        {
            ttl = GetActiveWindowTitle();
            if (ttl != null)
            {
                if (ttl.ToLower() == "xxxxxxxxxxx")
                {
                    SendKeys.SendWait("{ENTER}");
                }
            }
        }
        catch (Exception err)
        {
            Write2ErrLog(err, "OnTimedEvent");
        }
    }

Вот метод GetActiveWindowTitle ().

    static private string GetActiveWindowTitle()
    {
        try
        {
            const int nChars = 256;
            IntPtr handle = IntPtr.Zero;
            StringBuilder Buff = new StringBuilder(nChars);
            handle = GetForegroundWindow();

            if (GetWindowText(handle, Buff, nChars) > 0)
            {
                return Buff.ToString();
            }
            return null;
        }
        catch (Exception e)
        {
            Write2ErrLog(e, "GetActiveWindowTitle");
            return null;
        }
    }

Вот ошибки, которые я получаю:

4/19/2011 12:57:16 PM: System.InvalidOperationException: Queue empty.
   at System.Collections.Queue.Dequeue()
   at System.Windows.Forms.SendKeys.SendInput(Byte[] oldKeyboardState, Queue previousEvents)
   at System.Windows.Forms.SendKeys.Send(String keys, Control control, Boolean wait)
   at System.Windows.Forms.SendKeys.SendWait(String keys)
   at DataViews_SendKeys.Form1.OnTimedEvent(Object source, ElapsedEventArgs e)  OnTimedEvent

4/19/2011 1:03:11 PM: System.ArgumentException: Destination array was not long enough. Check destIndex and length, and the array's lower bounds.
   at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
   at System.Collections.Queue.Clone()
   at System.Windows.Forms.SendKeys.Send(String keys, Control control, Boolean wait)
   at System.Windows.Forms.SendKeys.SendWait(String keys)
   at DataViews_SendKeys.Form1.OnTimedEvent(Object source, ElapsedEventArgs e)  OnTimedEvent

4/19/2011 1:04:00 PM: System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
   at System.Windows.Forms.UnsafeNativeMethods.PeekMessage(MSG& msg, HandleRef hwnd, Int32 msgMin, Int32 msgMax, Int32 remove)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.SendKeys.Flush()
   at System.Windows.Forms.SendKeys.Send(String keys, Control control, Boolean wait)
   at System.Windows.Forms.SendKeys.SendWait(String keys)
   at DataViews_SendKeys.Form1.OnTimedEvent(Object source, ElapsedEventArgs e)  OnTimedEvent

Следует отметить, что компьютер, на котором я запускаю эту программу, - это сервер HP с процессором Intel Xeon, а ОС - Windows XP Программа работает без ошибок на моем ноутбуке, но не на сервере. Есть мысли?

1 Ответ

0 голосов
/ 22 октября 2014

Вероятно, это вызвано тем, что UAC включен на вашем сервере, но не на рабочем столе. Я испытал такое же поведение при использовании SendKeys.Send ()

Еще одна вещь, которую нужно проверить, - это версия .NET, против которой вы строите. См. SendKeys Отправить заблокирован .

...