2

Teensy をキーボードとして使用するプログラムを作成しようとしています。入力に応じて特定の文字列を出力したいのですが、一部の文字列はかなり長いです。Keyboard.print()Arduino IDE には、文字列の送信を可能にする単純な関数があることを知っています。この機能は C にも存在しますか?

4

1 に答える 1

0

あなたの質問はかなり不明確なので、そこから得た両方の解釈に答えました。

Teensy を入力デバイスとして使用する場合。

はい、お好みの OS でteensyduinoを使用すれば、すべての Teensy ユニットで可能です。コードを入力し、Teensy を HID デバイスとして設定して使用するだけです。
良いアドバイスをもう一度述べると、不正なキーボードはすぐに多くの問題を引き起こす可能性があるため、慎重にテストしてください。

Cプログラムでキーボードをエミュレートすることについて言及している場合。

はい、これも可能です。

Linux の説明

コード例- SO で見つかりました
。この例#define KEYCODE XK_Downでは、「安全」な を使用していますが、表示するのが難しい場合があります。#define KEYCODE XK_A#include <unistd.h>、およびusleep(2000000); // 2 secondsを適切な場所に追加して、動作を制御してみてください。
さらに、C++ の代わりに C が必要な場合は、inに変更Window &winします。Window wincreateKeyEvent

以下の変更されたコードXFakeKey.c

// Send a fake keystroke event to an X window.
// by Adam Pierce - http://www.doctort.org/adam/
// This is public domain software. It is free to use by anyone for any purpose.

// debug message, delay, and conversion to C by ti7
// original code found at http://www.doctort.org/adam/nerd-notes/x11-fake-keypress-event.html

#include <X11/Xlib.h>
#include <X11/keysym.h>

// The key code to be sent.
// A full list of available codes can be found in /usr/include/X11/keysymdef.h
//#define KEYCODE XK_Down
#define KEYCODE XK_A

// Function to create a keyboard event
XKeyEvent createKeyEvent(Display *display, Window win,
                           Window winRoot, int press,
                           int keycode, int modifiers)
{
   XKeyEvent event;

   event.display     = display;
   event.window      = win;
   event.root        = winRoot;
   event.subwindow   = None;
   event.time        = CurrentTime;
   event.x           = 1;
   event.y           = 1;
   event.x_root      = 1;
   event.y_root      = 1;
   event.same_screen = True;
   event.keycode     = XKeysymToKeycode(display, keycode);
   event.state       = modifiers;

   if(press)
      event.type = KeyPress;
   else
      event.type = KeyRelease;

   return event;
}

#define true 1
#define false 0

#include <stdio.h> // for printf
#include <unistd.h> // for time
main()
{
// Obtain the X11 display.
   Display *display = XOpenDisplay(0);
   if(display == NULL)
      return -1;
    printf("it's working\n");
// Get the root window for the current display.
   Window winRoot = XDefaultRootWindow(display);

    usleep(1000000);
// Find the window which has the current keyboard focus.
   Window winFocus;
   int    revert;
   XGetInputFocus(display, &winFocus, &revert);

// Send a fake key press event to the window.
   XKeyEvent event = createKeyEvent(display, winFocus, winRoot, true, KEYCODE, 0);
   XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);

// Send a fake key release event to the window.
   event = createKeyEvent(display, winFocus, winRoot, false, KEYCODE, 0);
   XSendEvent(event.display, event.window, True, KeyPressMask, (XEvent *)&event);

// Done.
   XCloseDisplay(display);
   return 0;
}

でコンパイルgcc -o XFakeKey XFakeKey.c -L/usr/X11R6/lib -lX11

ウィンドウの例

コード例
私は勇気があり、これをテストしていないので、パンツを握ってください。

于 2015-12-01T04:19:53.560 に答える