タイトルは釣りです。
Androidのソフトウェアキーボードで文字を打つのは辛いものです。
電車の中ならともかく、ログイン画面のデバッグするたびにメールアドレス打つのは、気が狂いそうになります。
しかし卓上で使うためにBluetoothキーボードを買うのはエコでは無いので、PCのRealForceを活用してあげましょう。
当然ADBは入っているはずなので、
[bash]
$ adb shell input text test@example.com
$ adb -s HT1234567890 shell input text test@example.com
[/bash]
とやればOKです。デバイスが2個以上接続されているときは、2個目のようにシリアルNoを指定してあげましょう。
しかし、毎回adb shell input textと打つのは疲れます。
そこで、シェルを使いこなしてスマートに解決!せずに、無駄にGUIアプリでも作ってみましょう。
executeしているだけなのでえらく簡単です。
パスワードをマスクしたり↑キーで履歴を辿ったりする程度の気遣いがあれば、多少は実用的ですね。
[csharp]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.IO;
namespace AdbInputer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
updateDeviceList();
}
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
doAdbInput(textBox1.Text);
textBox1.Text = "";
}
}
private void doAdbInput(string text)
{
string command = "adb";
Device selected = deviceList.SelectedItem as Device;
if (selected != null)
{
command += " -s " + selected.serial;
}
command += " shell input text \"" + text + "\"";
doCommand(command);
LogBox.Text += text + "\n";
}
private string doCommand(string command)
{
try
{
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd.exe";
psi.RedirectStandardInput = false;
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
psi.CreateNoWindow = true;
psi.Arguments = @"/c " + command;
Process p = Process.Start(psi);
return p.StandardOutput.ReadToEnd();
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
return null;
}
private void updateDeviceList()
{
deviceList.Items.Clear();
foreach (Device d in getDeviceList())
{
deviceList.Items.Add(d);
}
}
private Device[] getDeviceList()
{
List devices = new List();
try
{
string res = doCommand("adb devices");
StringReader reader = new StringReader(res);
string line;
while ((line = reader.ReadLine()) != null)
{
string[] strs = line.Split(new char[] { '\t' }, StringSplitOptions.RemoveEmptyEntries);
if (strs.Length == 2)
{
devices.Add(new Device { serial = strs[0], type = strs[1] });
}
}
}
catch (Exception e)
{
MessageBox.Show(e.ToString());
}
return devices.ToArray();
}
private class Device
{
public string serial { get; set; }
public string type { get; set; }
public override string ToString()
{
if (serial == null || type == null)
{
return "(not available)";
}
return "[" + type + "] " + serial;
}
}
}
}
[/csharp]
textBox1とかForm1とかにやる気のなさが滲み出ています。