質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

3103閲覧

ジャイロセンサを用いてキーボードのWASD入力をしたい。

damball

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2017/01/02 19:32

###前提・実現したいこと
当方プログラミングは全くの初心者なため、用語等の間違いは指摘していただけると幸いです。
Visual studioでジャイロセンサを使ってキーボードのwasd入力をしたいと考えています。プログラミングは全くの初心者でなにをどうしたらいいかよくわかっていません。取り合えず、手探りでジャイロセンサの出力だけ-1 or 1でコンソールに表示することはできました。次にキーボード入力の方に取り掛かっているのですが、”sendkeys”が使えず困っています。
###発生している問題・エラーメッセージ

82行目が 「'program.send(string)'はabstract、exterm、またはpartialに指定されていないため、本体を宣言する必要があります。」 91、94、97、100、103行目が 「現在のコンテキストに’sendkeys’という名前は存在しません。」

###該当のソースコード

C#

1using System; 2 3using Zmp.Imuz.Communication; 4 5namespace Zmp.Imuz.Sample.SimpleCommunicationSample 6{ 7 // BluetoothかCAN(USB)接続されたIMU-Zの計測データを 8 // コンソールに表示する最もシンプルなプログラムです。 9 class Program 10 { 11 12 static void Main(string[] args) 13 { 14 // お使いの環境に合わせてCOMポートを変更してください。 15 const string ImuzCommPortName = "COM4"; 16 const PortType portType = PortType.Bluetooth; 17 //const PortType portType = PortType.Can; 18 19 20 // ポートを指定して ポートオブジェクトを生成します。 21 // 22 // CreateCommunicationPortでは、実際にシステムにポートが存在するか、また、 23 // 開けるかどうかにかかわらず、ポートオブジェクトを生成します。 24 ICommunicationPort port = CommunicationManager.CreateCommunicationPort(ImuzCommPortName, portType); 25 26 // ポートを開きます。 27 if (port.Open()) 28 { 29 // 成功したら、計測データ受信イベントのハンドラを登録します。 30 port.MsgMeasurementReceived += onMsgMeasurement; 31 32 } else { 33 // 失敗したらメッセージを出力します。 34 // 失敗の原因は様々ですが、指定したCOMが存在するか確認してください。 35 Console.WriteLine("Can not open the port. {0}", ImuzCommPortName); 36 } 37 38 // キーボードから'q'(Enter)を入力するとアプリケーションを終了します。 39 string str; 40 do 41 { 42 str = Console.In.ReadLine(); 43 } while (!(str.Length > 0 && str[0] == 'q')); 44 45 // 通信を切断して、ポートを閉じます。 46 port.Close(); 47 } 48 49 // 計測データ受信イベントのハンドラです。 50 // IMU-Zからデータを受信するごとに呼ばれます。 51 // 52 // MeasurementDataの中にすべてのデータが入っているので、 53 // アプリケーションから自由に使えます。 54 55 // Openには成功するが、データ受信のメッセージが表示されない場合、 56 // 指定したCOMポートが、IMU-Zに接続されている正しいBluetoothポートかどうか 57 // 確認してください。 58 static void onMsgMeasurement(object sender, MeasurementData mess) 59 { 60 // ノード番号、タイムスタンプそして、加速度、ジャイロ、地磁気が3軸ずつ 61 // それぞれX,Y,Z軸の並びで入っています。 62 int x; 63 int y; 64 int z; 65 if (mess.gyro[0] < 0) 66 { x = -1; } 67 else 68 { x = 1; } 69 if (mess.gyro[1] < 0) 70 { y = -1; } 71 else 72 { y = 1; } 73 if (mess.gyro[2] < 0) 74 { z = -1; } 75 else 76 { z = 1; } 77 Console.WriteLine(" ({0},{1},{2})", 78 x, y, z); 79 80 81 } 82 public static void send(string keys); 83 private void receivedDataProcessing(String recieveData) 84 { 85 recieveData = recieveData.Replace("\r", ""); 86 recieveData = recieveData.Replace("\n", ""); 87 88 switch (recieveData) 89 { 90 case "W": 91 SendKeys.Send("w"); 92 break; 93 case "A": 94 SendKeys.Send("a"); 95 break; 96 case "S": 97 SendKeys.Send("s"); 98 break; 99 case "D": 100 SendKeys.Send("d"); 101 break; 102 case "Space": 103 SendKeys.Send(" "); 104 break; 105 } 106 } 107 } 108}

###試したこと
sendkeysの宣言をしたのですがやはり反応しませんでした。宣言の仕方が間違っているのでしょうが、どう書いたらいいのか分からないため何も手につかない状態です。後に少し手直ししたものを書きました。リンクを張っておきます。
https://github.com/damball/Imuz/blob/master/Imuz_sample2.txt

###補足情報(言語/FW/ツール等のバージョンなど)
言語:C#
環境?:Blend for Visual Studio 2015

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こちらを参考にusingにSystem.Windows.Formsを追加してみてください。

投稿2017/01/03 01:20

turbgraphics200

総合スコア4267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

damball

2017/01/03 12:32

回答ありがとうございます。非常に参考になりました。 その後、プログラムを書き換えて実行したところ以下のようなエラーが出てしまったのですが、解決方法はご存知でしょうか。 「型 'System.InvalidOperationException' の例外が System.Windows.Forms.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした 追加情報:SendKeys は、Windows のメッセージをハンドルしないため、このアプリケーションの中で実行できません。アプリケーションがメッセージをハンドルするように変更するか、または SendKeys.SendWait メソッドを使用してください。 この例外のハンドラーがある場合は、プログラムを安全に続行できます。」
damball

2017/01/03 12:40

追記:プログラムは82行以下を削除して、代わりに下記のように変更しました。 if (mess.gyro[0] > 1) { Console.WriteLine("A"); SendKeys.Send("a"); } else if (mess.gyro[0] < -1) { Console.WriteLine("D"); SendKeys.Send("d"); } if (mess.gyro[1] > 1) { Console.WriteLine("S"); SendKeys.Send("s"); } else if (mess.gyro[1] < -1) { Console.WriteLine("W"); SendKeys.Send("w"); }
turbgraphics200

2017/01/03 12:58

あ、コンソールアプリでしたね。エラーメッセージが示す通り、SendWait()に変えてみてください。
damball

2017/01/03 13:32

できました! ありがとうございます!! 本当に助かりました。感激です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問