Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > клавиатура и С#


Автор: 70n70 9.9.2006, 16:04
не подскажите  как сделать тчобы при нажатии кнопки в активное окно добавлялось "значение" кнопки. пример кнопка "а" и добавлялась буква "а".. в окно которе сейчас используется...(не считая саму программу)
или пример показать..

Автор: $tatic 9.9.2006, 17:49
Пользуйся классом System.Windows.Forms.SendKeys

Автор: 70n70 9.9.2006, 18:25
я конечно извиняюсь, но не могли бы вы привести пример. smile

70n70

Автор: ivashkanet 9.9.2006, 19:41
Если приложение твое, то выставляешь наружу метод формы ReceiveKey(string Key);
Код

private void ReceiveKey(string key)
{
   System.Windows.Forms.SendKeys.Send(key);
}


Если нет, то есть пример из MSDN:
Код

// Get a handle to an application window.
[DllImport("USER32.DLL")]
public static extern IntPtr FindWindow(string lpClassName,
    string lpWindowName);

// Activate an application window.
[DllImport("USER32.DLL")]
public static extern bool SetForegroundWindow(IntPtr hWnd);

// Send a series of key presses to the Calculator application.
private void button1_Click(object sender, EventArgs e)
{
    // Get a handle to the Calculator application. The window class
    // and window name were obtained using the Spy++ tool.
    IntPtr calculatorHandle = FindWindow("SciCalc", "Calculator");

    // Verify that Calculator is a running process.
    if (calculatorHandle == IntPtr.Zero)
    {
        MessageBox.Show("Calculator is not running.");
        return;
    }

    // Make Calculator the foreground application and send it 
    // a set of calculations.
    SetForegroundWindow(calculatorHandle);
    SendKeys.SendWait("111");
    SendKeys.SendWait("*");
    SendKeys.SendWait("11");
    SendKeys.SendWait("=");
}





P.S. Ничего не проверял, но должно работать smile

Автор: Exception 10.9.2006, 19:40
Так ведь SendKeys и шлёт клавишу активному приложению smile .

Автор: $tatic 10.9.2006, 20:36
Так как планируется создать аналог экранной клавиатуры, то ее приложение будет являться активным во время его использования. Поэтому не надо забывать переключать фокус окна на требуемое приложение, поскольку еще ДО нажатия кнопки (точнее, до срабатывания события Click) на неактивной форме клавиатуры, на нее будет переходить фокус. Я не знаю как это противоречие разрешено в экранной клавиатуре винды. Может необходимо запоминать в отдельном потоке активное приложение (если это не клавиатура), затем при наступлении события активировать это окно и печатать в него.

Автор: mr.DUDA 10.9.2006, 22:44
В экранной клавиатуре используется windows hook, даю зуб на отсечение smile... И не нужно менять фокус.

Автор: ivashkanet 11.9.2006, 08:52
Цитата(mr.DUDA @  10.9.2006,  22:44 Найти цитируемый пост)
В экранной клавиатуре используется windows hook, даю зуб на отсечение ... И не нужно менять фокус.

Не понял идею  smile Поясни  smile  smile
Имхо Дело обстоит так:
Получаем клавишу. Отправляем клаву на задний план --- становиться активным приложение с которым работал пользователь до нажатия на клаву. Отправляем ему кнопку. Возвращаем клаву на место.

Единственный скользкий момент --- клава будет прыгать вверх- вниз, но я думаю можно сделать ее всегда на верху других окон (это логично), тогда можно (а можно ли) просто убирать с нее фокус.

P.S. 
Цитата(ivashkanet @  9.9.2006,  19:41 Найти цитируемый пост)
Если приложение твое, то выставляешь наружу метод формы ReceiveKey(string Key);

Действительно бред какой-то написал. "Если приложение твое... " -- на кой тогда SendKeys  smile 

Автор: $tatic 11.9.2006, 17:00
mr.DUDA, проблема в том, что хуки - это системное программирование, а нам надо под .NET smile

Автор: mr.DUDA 12.9.2006, 11:06
Вроде я не так понял. Если нужно просто послать нажатие клавиши в выбранное окно - незачем делать его активным, т.к. это может проглючить (остаться висеть) и вообще будет заметно. Достаточно просто вызвать SendMessage с сообщениями WM_KEYDOWN/WM_KEYUP, см. тему про программное нажатие кнопок в приложении.

Автор: $tatic 12.9.2006, 14:19
mr.DUDA, да, наверное ему так лучше будет. И оформить в класс.

Автор: neProger 24.6.2010, 13:36
А есть ли что-нибудь еще кроме System.Windows.Forms.SendKeys.Send и keybd_event, чтобы имитировать нажатие кнопки?

В некоторые игры не удаеца отправить клавишу таким образом (игры не риагируют на нажатие), а вот тот же пунтосвичер и экранная клавиатура отправляют туда клавиши на ура. Как это у них получаеца?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)