2017-01-15 2 views
2

У меня есть очень простая программа на C# с простым текстовым полем и некоторыми другими вещами. У меня есть кнопка, которая запускает таймер, я хочу, чтобы с каждым тиком таймера я могу отправить ключ в текстовое поле (настроено так, что отправка ключа в форму отправит его в текстовое поле).Отправить ключ к форме, даже если она сведена к минимуму

мой код теперь:

private void timer2_Tick(object sender, EventArgs e) 
    { 
     SendKeys.SendWait("ciao"); 
    } 

Но это работает только тогда, когда форма видна и с фокусом

EDIT: по некоторым причинам я не хочу использовать «TextBox.Text = текст»

+1

Вы не можете использовать SendKeys() для таргетинга на минимизированную форму. SendKeys() работает только с приложением, которое в настоящее время ** активно ** и имеет ** фокус ** (открыто на экране перед пользователем). Для минимизированного приложения вам нужно будет получить прямой ** handle ** в свой целевой TextBox (возможно, с помощью FindWindow()/EnumWindows()), а затем использовать SendMessage()/PostMessage(), чтобы отправить его нажатием клавиш. –

+0

[Отправка данных в блокнот] (http://stackoverflow.com/a/39706017/3110834) –

+0

Вы можете активировать окно и SendKeys перед деактивацией: http://stackoverflow.com/questions/41215435/event-that-triggers -До-моя форма-теряет фокус- –

ответ

1

Вы не можете использовать SendKeys, потому что он посылает свой вклад в данный момент окна:

Поскольку нет управляемого способа для активации другого приложения, , вы можете использовать этот класс в текущем приложении или использовать собственные методы Windows, такие как FindWindow и SetForegroundWindow, до сфокусировать внимание на других приложениях.

Но вы можете использовать WinAPI SendMessage функцию, как это описано более подробно here.

Принимая во внимание, что вы знаете Form, что текстовое поле содержится, вы можете получить его дескриптор с помощью Control.Handle property, так что это будет выглядеть следующим образом:

public static class WinApi 
{ 
    public static class KeyBoard 
    { 
     public enum VirtualKey 
     { 
      VK_LBUTTON = 0x01, 
      ... 
      VK_RETURN = 0x0D 
     } 
    } 


    public static class Message 
    { 
     public enum MessageType : int 
     { 
      WM_KEYDOWN = 0x0100 
     } 

     [DllImport("user32.dll")] 
     [return: MarshalAs(UnmanagedType.Bool)] 
     public static extern bool SendMessage(IntPtr hWnd, MessageType Msg, IntPtr wParam, IntPtr lParam); 
    } 
} 

private void timer2_Tick(object sender, EventArgs e) 
{ 
    WinApi.Message.SendMessage(
     hWnd: this.textBox.Handle, // Assuming that this handler is inside the same Form. 
     Msg: WinApi.Message.MessageType.WM_KEYDOWN, 
     wParam: new IntPtr((Int32)WinApi.KeyBoard.VirtualKey.VK_RETURN), 
     lParam: new IntPtr(1)); // Repeat once, but be careful - actual value is a more complex struct - https://msdn.microsoft.com/en-us/library/ms646280(VS.85).aspx 
} 

PS: Вы также можете быть заинтересованы в PostMessage function ,

PS1: Хотя это решение должно работать, я бы хотел указать, что в идеале вы не должны использовать такие механизмы, чтобы что-то делать в своем собственном приложении - отправка ключей не всегда надежна и может быть трудно проверить , И обычно есть способ добиться желаемого результата, не прибегая к таким подходам.

Смежные вопросы