a23_useSelfMade #9
2023.05.01 Moni #1 [easy-C]
- [1]みなさんは、RPAって聞いたことがあるでしょうか。
- Robotic Process Automation の略のことで、つまりキーやマウスの動作をプログラムで動かすことで、PC作業を自動でやらせようみたいな話です。
- easy-Cでこれができたら小学生は喜ぶのではないかと思いました。
- [2]そもそもプログラミングって、車の運転みたいなものだと思うのです。この機械を自由に操作したい、と。PCの操作で一番普通なのは、マウスやキーの操作でしょう。
- ・・・変数に値を入れるとか、ウィンドウを開くとか、ウィンドウ上に線を引くとかは、小学生にとっては自然な「PCの操作」ではありません。それらはプログラミングでしかできないことかもしれませんが、でももっと普通のことだってやりたいと思うかもしれません。
- コンソールでコマンドを打っていた時代は、リダイレクトとかパイプが使えれば、他人が作ったアプリを好きなように利用できましたが、今はGUIの時代です。だからマウスやキーの操作を自動でやれるようにしてやれば、原理的にはかなり多くのアプリケーションがコントロールできるはずです。
- [3]とりあえず以下のようなことができるところまで作りました。
ARpa rpa[1]; ARpa_init(rpa);
ARpa_Win rpawin = ARpa_srchWinNam(rpa, "Chrome", 0); // Chromeをウィンドウ名に含むウィンドウを検索.
if (rpawin == 0) exit(1); // 見つからなければエラー終了.
ARpa_setWinPos(rpa, rpawin, 0, 0); // ウィンドウの左上の端に移動.
ARpa_activeWin(rpa, rpawin); // ウィンドウを入力アクティブにする.
- これで狙ったウィンドウを好きな位置に移動できるので、自動運転がしやすくなります。
- また自動運転をしないとしても、「このウィンドウがいつもこの位置にいてほしい」みたいなお気に入りの配置パターンがあるのなら、こんな感じのプログラムを書くことで、いつでも整列させられます。
- 今はウィンドウが見つからない場合は終了していますが、system関数で見つからないアプリを起動するようにすれば、起動直後の何もない状態から必要なものを全部起動して、いい感じに並べるというプログラムもできます。
- ARpa_setWinSiz()もあるので、ウィンドウのサイズ調整もできます。
- [4]こんなのもできます。ワンライナーで、
HL9>!ARpa w;for(;;){ARpa_getMosPos(&w);printf(" (%04d,%04d) #%06x \r", w.x, w.y, ARpa_getPix(&w, w.x, w.y, 0));aWait(100);}
- ってやれば、マウスの座標とその場所の色をリアルタイムで確認できます。
- [5]ウィンドウ名だけで単純に区別できないときは、
ARpa rpa[1]; ARpa_init(rpa);
ARpa_Win win[1000];
int n = ARpa_getWin(rpa, win, 1000, 0);
- とするだけで画面上のすべてのウィンドウハンドルがwin[]に入ります。nは個数です。
- だからこのウィンドウハンドルを使って、
ARpa_getWinNam()
ARpa_getWinPos()
ARpa_getWinSiz()
- ができるので、それでどれが自分の探しているウィンドウかを判別します。
2023.05.02 Tue #1 [easy-C]
- a23_usm006の 2023.03.16 Thu #1 で、HL-9での演算子の優先順位を変えたらどうかということを考えていましたが、これはやっぱりよくないと思いなおしました。C言語との互換性が保てなくなる改造は良くないです。
- 優先順位を変えるのではなく、新しい演算子を適当な優先順位で追加すればいいのです。・・・うん、よし、この方向で考えよう!
- 問題になっているのは、代入演算子の優先順位が(比較演算子と比べて)低いことと、ビット演算の演算子の優先順位が(比較演算子と比べて)低いことです。この2点がなんとかなれば、かっこは減らせるはずです。
2023.05.02 Tue #2 [easy-C]
- 拡大鏡のプログラムです。マウス周辺を拡大して表示します。
- (こういうのができるようになりました。)
ARpa rpa; ARpa_init(&rpa);
AWin *win = aOpenWin(256, 256, "loupe");
while (!AWin_isClose(win)) {
ARpa_getMosPos(&rpa);
int *p = ARpa_capture(&rpa, 64, 64, rpa.x - 32, rpa.y - 32, 0);
[j = 0:<64] { [i = 0:<64] {
aFillRect(win, 4, 4, i * 4, j * 4, *p++ & 0xffffff);
} }
ARpa_captureFree(&rpa);
aWait(100);
}
2023.05.08 Mon #1 [easy-C]
- prsで全角文字を表示しようとして、今のHL-9が全角文字を含む文字列のことを全く考えていないことを思い出しました。
- これは不便だと思ったので直しました!
こめんと欄