2016年3月15日火曜日

C# BackgroundWorkerでClipboardを使うときはInvoke

これは全くゲーム関係ない事です・・。

ロリポップ!レンタルサーバ

めも

スレッド中からクリップボードを操作するとき

            Dispatcher.Invoke(new Action(() =>
            {
                System.Windows.Forms.Clipboard.SetText(data);
            }));

スレッド中からはUIがいじれないのと同様に

クリップボードも弄れないのでinvokeして使いました。

検索したら英語のサイトしかなかったので、めも程度に残します。


クリップボードって1個だけしかないのね、ハードに近いオブジェクトなのかな・・?

仕組みによっては、退避処理つくらないとバグになりそうな感じ



C#簡単で生産性が高くていい感じですね(・ω・)とか偉そうに言ってみる。


何で急にクリップボードの話になったかというと、スマホに文字入力しようとして困ったからです

adb で全角入力まで対応する場合、スマホ側に受け手になるサービスを作りこまないといけないらしく

androidまで作りたくなかったので、C#からのコピペで対応しました

ロリポップ!レンタルサーバ

実機をマクロ化(android)シェルを使うバージョン

スマホにシェルを置いてマクロ化する方法です。
まずはシェルの準備。

ロリポップ!レンタルサーバ

○使うもの

Android携帯
PC
USBケーブル
adb.exe

○やること
前準備        ・・・環境を整える
シェル作成の調査 ・・・シェルを作るためにスマホのログを調査
シェル作成     ・・・シェルを作成


○手順
--------------
●前準備

1.adb.exeを入手(AndroidSDKの中に入ってます。)

2.USBデバッグをONにする方法をぐぐって調べる。

3.マクロ確認用に、スマホに絵をかくスマホアプリをインストール
  私は「スケッチ」をつかってます。
  https://play.google.com/store/apps/details?id=com.sonymobile.sketch&hl=ja


●自分のスマホ用に、シェルを作るための調査

1.USBでPCとスマホを繋ぎます。

2.USBデバッグを許可します。

3.コマンドプロンプトを起動
  (windowsキー + Rキー → cmd → OK押下)

4.adbで接続確認「adb devices」


6.スマホでお絵かきアプリを立ち上げる
7.コマンドプロンプトで、スマホのイベントログをとる
  「adb shell getevent /dev/input/event0

8.スマホのお絵かきアプリ上で、タップ
9.コマンドプロンプト上にログが流れなかったら、「ctrlキー + Cキー」で、停止して
  7.へ戻って、event1、event2、event3、、と調べていく。

10.ログが流れたらeventの何番だったかメモメモ(上記だとevent1です)


●自分用のシェルの作成

1.PCのテキストでシェルを作ります。

ファイル名:tap.sh(名前何でもいいです。event1の番号を端末にあわせて変更)
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 55 0
sendevent /dev/input/event1 3 53 $1
sendevent /dev/input/event1 3 54 $2
sendevent /dev/input/event1 3 58 53
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
/system/bin/sleep $5
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 55 0
sendevent /dev/input/event1 3 53 $3
sendevent /dev/input/event1 3 54 $4
sendevent /dev/input/event1 3 58 53
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0

2.adbで接続して適当なフォルダにプッシュします。
   今回の例は/sdcard/downloadにプッシュ
  (追記:3月23日うまく動かない場合はスマホ側で、ファイルを作成しなおしてみてください。PC側で作ってからプッシュだと、文字コードとか改行コードとかが怪しいような感じだったので追記しました。

   tap.shを保存したフォルダで「adb push tap.sh /sdcard/download」
   

13.シェルのテスト

   スマホにお絵かきアプリが立ち上がった状態で
   「adb shell sh /sdcard/download/tap.sh 500 500 400 400 1」
                            引数は、[X1 Y1 X2 Y2 秒]、
   線が引けるはずです。

もし動かない場合は、イベントログを見て、シェルを修正する必要があります。
イベントログは16進で書いてあるので、シェルに書くときは10進にしてください。

---------------------

白猫だと
「adb shell sh /sdcard/download/tap.sh 500 700 700 500 1」とかで
スキル1が発動すると思います。
意味は、座標(500,700)で1秒長押しして、座標(700,500)までスワイプです。
                     (長押し、右斜め上方向にスワイプ)
「adb shell sh /sdcard/download/tap.sh 500 500 500 500 1」とかで長押し(ガードとか)になります。
「adb shell input tap 500 500」 こっちはタップ(攻撃とか)(標準で用意されてるコマンド)


ここまでできればあとはキックするプログラムかスクリプトを組めばOKです。


ロリポップ!レンタルサーバ

2016年3月3日木曜日

アンドロイドのマクロはシェルが良さそう(adb 長押し スワイプ いろいろ操作)

いろいろやってみたけど

アンドロイドのマクロはシェルが楽でした。

スマホのsdcardのdownloadに入れて、起動する感じです。


例えば、タップの長押しとかは(べた書きですが)
longpress.sh

sendevent /dev/input/event7 1 330 1
sendevent /dev/input/event7 3 58 1
sendevent /dev/input/event7 3 53 $1
sendevent /dev/input/event7 3 54 $2
sendevent /dev/input/event7 0 2 0
sendevent /dev/input/event7 0 0 0
sleep 1
sendevent /dev/input/event7 1 330 0
sendevent /dev/input/event7 3 58 0
sendevent /dev/input/event7 3 53 $1
sendevent /dev/input/event7 3 54 $2
sendevent /dev/input/event7 0 2 0
sendevent /dev/input/event7 0 0 0

とかにして、同様に何個か必要な動きを作っておいて
メインのシェルで呼び出す感じです。
$1はx座標
$2はy座標
2か所あるのは、1点目と2点目。2個めの$1と$2を$3を$4にすればスワイプになる。

※event7 の 7 は端末によって違うので
adb shell getevent /dev/input/event●


●の数字を0~順に見てタップして、何番目が該当するか調べます。


プニこん専用のシェルも何個かつくって配置して、メインのシェルを書けばOKですね^^

IPとポート指定でADBでキックする場合は
adb -s [IP:port] shell [作ったシェルのパス] [x座標] [y座標]
 例: adb -s 192.168.12.105 shell /sdcard/Download/longpress.sh 100 200
シェルに実行権限をつけてもたぶん大丈夫です。キック方法は好きなやり方でOKです。

まとまったらアップします。
今度はアーカイブじゃなくてテキストファイルなので、
ダウンロードサイトは使わずに、ブログにペタペタ張ります。



余談ですが、既存のコマンドの一部は、DalvikVMを再利用しない作りになってるらしいです。
VMを再利用するように直すといろいろスムーズになるかもしれませんね。

最後に使ったアクティビティを調べるシェルは
aaaa.shとか適当な名前で保存して
logcat -b events -d | grep am_create_activity | tail -n 1

こんな感じ、tailもgrepも使えるから素敵(・ω・)xargsとかもあればよかったけど無いポイね


追記:3/14
xargs無いな~と思ってたら、AndroidTerminalEmulatorというスマホアプリを入れたら普通に使えました^-^
wgetもあったので、何でもインストールできそうと思い
とりあえずgccのインストールを試みたのですがうまくいかず、試行錯誤しています。

私的にはimagemagickあたりが使えればメチャ便利なので、なんとかコンパイル環境を整えたいです。

ゲームやってただけのはずがなぜかどんどん深みにはまっていくこの感じ(・ω・)

C#とadbでコツコツとツールを作って
指定した画像をクリックしたりするマクロファイルを生成ツールも作ってあるのです。
(でもこれは、シェルをスマホ側に置かないといけないので生理的に配布できないのでした。)
シェルで作ったのはスクリーンショットを取ることと、長押し、スワイプ
C#で作ったのはシェルキックする機能と、ローカル画像とスクショを比較する機能。
画像比較してる部分をスマホ側に移植するためにImageMagickを使いたくなって
コンパイル環境を整えるところで今止まってます。