C#で他のアプリの文字入力フォームに指定の文字を入力する方法

このQ&Aのポイント
  • C#で他のアプリケーションの文字入力フォームに指定の文字を入力する方法について解説します。
  • SendKeys.SendWait()メソッドを使用することで、他のアプリケーションのフォームに文字を入力することが可能です。
  • 以下のようなコードの例をご参考ください。
回答を見る
  • ベストアンサー

c#で他のアプリの文字入力フォームに指定の文字を入力したい

例えばabc.exeというアプリがあったとします。 このアプリには文字列を入力するフォームがいくつかあり、 このアプリのフォームに文字を入れるプログラムを作成したいと思います。 まずはabc.exeをアクティブにし、 アプリのフォームの上から順に配列に代入された文字列の入力をしたいと思います。 つまり、 abc.exeの一番上のフォームにはmoji[0]にある文字列 二番目のフォームにはmoji[1]にある文字列 三番目のフォームにはmoji[2]にある文字列 という形です、こういったことは可能でしょうか? SendKeys.SendWaitというのはこういうケースでも使えるのでしょうか? もし可能であれば解説ページ、コードの例をご教示頂ければ幸いです。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rk_les
  • ベストアンサー率63% (23/36)
回答No.3

補足説明の方ありがとうございます。 かなり力技になってしまいますが・・・よければご参考までに まず市販ソフトということなのでTabIndexが設定されてると思います。 そこで、Button押下後Tabキーと入力文字キーを送ってやります。 下記にサンプルを記述します。 using System.Runtime.InteropServices; [DllImport("user32.dll")] extern static IntPtr GetWindow(IntPtr hWnd, uint uCmd); [DllImport("user32.dll")] extern static IntPtr GetForegroundWindow(); [DllImport("user32.dll")] extern static int GetWindowText(IntPtr hWnd, StringBuilder lpStr, int nMaxCount); [DllImport("user32.dll")] extern static bool IsWindowVisible(IntPtr hWnd); [DllImport("user32.dll")] extern static bool SetForegroundWindow(IntPtr hWnd); //ButtonClickイベント const int GW_HWNDNEXT = 2; StringBuilder sb = new StringBuilder(100); IntPtr hwnd = GetForegroundWindow(); while (hwnd != IntPtr.Zero) { if (IsWindowVisible(hwnd)) { GetWindowText(hwnd, sb, sb.Capacity); // タイトルバー文字列を取得 if (sb.ToString().IndexOf(textBox1.Text) != -1) { SetForegroundWindow(hwnd); // アクティブ /*** *ここにSendKeys.SendWaitでキーを送ります。 *ラジオボタンがある場合Tabキーでラジオボタンをアクティブにし「↑」「↓」ボタンで変更 *チェックボックスの場合スペースキーでOnOff切り替え可能 *下記にキーコードが記述されています。 *MSDN SendKeys:http://msdn.microsoft.com/ja-jp/library/system.windows.forms.sendkeys(VS.80).aspx * * ***/ break; } } hwnd = GetWindow(hwnd, GW_HWNDNEXT); } この例ではTextBox1に別アプリケーションの名前の一部を入れることでアクティブにしています。 Ex)GoogleChrome → Google を入力し、Button1をクリックでGoogleChromeがアクティブになります。 力技すぎて汎用性も何もありませんが・・・ご参考までに

master817199
質問者

お礼

ご丁寧な解説に感謝します。 さっそく実行しまして、自分の好み通りに設定したところ 面白いようにうまくいきました。 助かりました、本当にありがとうございます。 また機会がありましたらよろしくお願いします。

その他の回答 (2)

  • rk_les
  • ベストアンサー率63% (23/36)
回答No.2

申し訳ありません。説明を履き違えていましたね。 ちなみに補足ですが >早速本題ですが、キーロガーの様なソフトでいいんですよね・・・? これは別にキーロガー自体を指しているわけではありません。キーロガーの様な入力されたものを監視するということを指して記述しました。 監視するということは入力されたものが取得できるということです。 >アプリのフォームの上から順に配列に代入された文字列の入力をした いと思います。 このことからTextBoxか何かに文字を入れ配列に代入していると判断しました。そのことから「キーで入力した値を[文字を入れるプログラム(a)]のオブジェクトに格納する」と推測していました。 >シンプルに言うとaとbのアプリがありまして、bのアプリ内の変数に宣言されている文字列をaのアプリの文字入力フォームにボタン一つで入力するというものです。 正しい表現ではないですね。この書き方だとなんとなくは伝わりますが不明確な部分が多いです。 「b内で宣言した変数に代入されている文字列を、aの文字入力フォームに、aについているボタンで格納する。」 又は、 「b内で宣言した変数に代入されている文字列を、aの文字入力フォームに、bについているボタンで格納する。」 かどちらかですか?それとも違いますでしょうか? ちなみにaは自作ソフトというのは分かりますがbはどうなのでしょうか? 補足宜しくお願いします。

master817199
質問者

補足

rk_les様 度々のご回答に感謝します。 説明不足で申し訳ありません。 「b内で宣言した変数に代入されている文字列を、aの文字入力フォームに、bについているボタンで格納する。」というのが正しいです。 ちなみにbが自作ソフトでaが市販のソフトです、 市販のソフトの構成が複雑なため、入力の手間を省くために考えたのがbのソフトです。 お時間のある時にでもアドバイス頂ければ幸いです よろしくお願いします。

  • rk_les
  • ベストアンサー率63% (23/36)
回答No.1

こんにちは。 早速本題ですが、キーロガーの様なソフトでいいんですよね・・・? このようなソフトではグローバルフックをするのが一般的です。 試してはいませんがSendKeyでも出来るとは思います・・・がかなり面倒だとおもいます。 http://homepage1.nifty.com/MADIA/vc/vc_bbs/200502/200502_05020024.html 上記のサイトが非常に参考になると思います。 ご参考までに

master817199
質問者

補足

お返事ありがとうございます。 キーロガーとは違って、キーボード入力内容やマウスの動き等を記録する必要はございません。 私の説明が分かりにくいので申し訳ありませんが シンプルに言うとaとbのアプリがありまして、bのアプリ内の変数に宣言されている文字列をaのアプリの文字入力フォームにボタン一つで入力するというものです。 他のアプリを動かすアプリということです よろしくお願いします。

関連するQ&A

  • ファイル内の文字を配列に格納

    ファイル内の文字列をも表示させた上で、文字列を配列に1つずつ格納したいのですが、とっても簡単な方法で教えてください。 ファイル名は「abc」で配列名は「moji」でお願いします。

  • C言語 strlen 再入力を促す

    文字列の比較で、 文字列の長さが60以上の時、再入力を促します。 while文を使って書いてみたのですが、 文字列Bの入力の前に、もう一度意味もなく 「文字列Aを入力===>」が表示されたり。 文字列Aのほうが小さいのに「Aのほうが大きい」と 表示されるようになったり、変な感じです。 どなたかご指摘・ご指導のほどよろしくお願いします。 int main(void) { char moji1[100]; char moji2[100]; while(strlen(moji1)>60){     printf("文字列Aを入力===>"); scanf("%80s" ,moji1); } while(strlen(moji2)>60){     printf("文字列Bを入力===>"); scanf("%80s" ,moji2);    } if(compare(moji1,moji2)>0){ printf("===AはBより大きい===\n"); } else if(compare(moji1, moji2)<0){ printf("===AはBより小さい===\n"); } else if(compare(moji1, moji2)==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y && *x!=0){ x++; y++; } return (*x-*y); }

  • 入力された文字列を一文字ずつ配列に格納する方法

    例えばABCって文字列が入力されたら配列に data[0]="ABC" と格納するのではなく data[0]="A" data[1]="B" data[2]="C" と格納するにはどう書けばいいのでしょうか?

  • スマホで文字入力のアプリ

    スマホでサイトを開いてる時、サイト上の入力フォームがあるとして、その小さい枠内だと文字を入力しずらいので、メールフォームとかで入力できる設定とかアプリとかってありますか!?

  • フォームの入力項目に全角文字禁止の規制をかけたい

    フォームの入力項目に全角文字禁止の規制をかけたいのですが,どのような手段がありますか?教えてください。 具体的には,メールアドレスを入力してもらうインプットボックスです。 ABC@abc.com は,OKで, Abc@abc は,NGにしたいのです。(分かりずらいですが,最初のAが全角文字です。) よろしくお願いします。

  • C言語での文字列ソート動作について

    任意の文字列を入力し、その文字列を昇順にソートするプログラムを作ったのですが、入力する文字の文字数が大きく異なると期待した結果が得られません。 文字数が少なくなったり、他の配列の文字が混ざったりと言う結果に成ってしまっています。 何が原因か分からない状態です。 以下にサンプルを記載させて頂きますので、助言よろしくお願いします。 /*----------------------------------------- 入力例 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC BBBBBBBBBBBBBBBB AAAAAA -----------------------------------------*/ #include <stdio.h> #include <string.h> #include <stdlib.h> void swapc(char *cx , char *cy){ char tmp[100]; strcpy(tmp, cx); strcpy(cx, cy); strcpy(cy, tmp); } int main(){ char *num[100]; char str_tmp[100]; //文字列一時格納 int moji_cnt; //入力した文字列のカウント int n , m; // 文字列入力処理開始 printf("文字列を入力してください\n"); for( moji_cnt = 0 ; moji_cnt != 3 ; moji_cnt++){ scanf("%s", str_tmp); *(num+moji_cnt) = (char *)malloc(sizeof(char) * (strlen(str_tmp)+1)); //メモリ確保 strcpy(*(num+moji_cnt), str_tmp); } puts("\n"); // 文字数ソート処理 for(n = 0 ; n < moji_cnt-1 ; n++){ for(m = 1 ; m < moji_cnt-n ; m++){ if(strcmp(*(num+n) , *(num+n+m)) > 0){ swapc(*(num+n) , *(num+n+m)); // 文字列入れ替え } } } puts("\n"); for(n = 0;n != moji_cnt;n++){ printf("%s\n" , *(num+n)); } free(num); }

  • 2chの名前欄に特殊文字を入力したいのですが 

    2chの名前欄に「◆」の後アルファベット文字ABCを入力し 書き込みしたいのですが 普通に◆ABCと入力すると書き込み後◇ABCとなってしまい ◆が◇に変わってしまいます。 またこのURL ttp://www1.ttcn.ne.jp/~xxxxx/2ch/moji.htm の 特殊文字コードを使って ◆ABCと入力し書き込みすると   ◆     A     B     C  ◆  A  B  C ◆だけが表示され、それ以降はABCと表示されず違う文字が 出てきてしまいます。 ですので、どうすれば名前欄に◆ABCと書き込みする事が出来るか 教えて下さい。

  • C言語 文字列の比較 compare

    プログラミング初心者です。 60文字以内の文字列を入力して、 大小関係を比較・表示するプログラムなのですが・・ 「AはBより大きい」という結果しか出ません。 どこが間違っているのか、ご指摘お願いしますっ。 #include<stdio.h> int main(void) { char moji1[61]; char moji2[61]; printf("文字列Aを入力===>"); scanf("%60s" ,&moji1); printf("文字列Bを入力===>"); scanf("%60s" ,&moji2); if(moji1-moji2>0){ printf("===AはBより大きい===\n"); } else if(moji1-moji2<0){ printf("===AはBより小さい===\n"); } else if(moji1-moji2==0){ printf("===AとBは等しい===\n"); } return 0; } int compare(char *x, char*y) { while(*x==*y){ if(*x=='\0') return 0; x++; y++; } return (*x-*y); }

  • 文字列での代入 (C言語)

    こんにちは。 C言語を勉強しているのですが、どうしても分からないことがあるので質問しました。 まず下記のソースを見てください。 #include <stdio.h> int main() { char* moji; moji = "right Test \n"; printf(" moji = %s\n", moji); moji = "dot 255 left up down \n"; printf(" moji = %s\n", moji); getchar(); return 0; } char* mojiがメモリを取らずに代入できているのですがこういった事が可能なのは何故でしょうか? その後もmojiの変数を別の文字列定数で書き換えています。 こういったことはできなかったはずなんですがどうしてでしょうか? 自分の開発環境だとVS.2005 VC++です。 よろしくおねがいします。

  • 2次元配列の宣言について

    文字列の配列の場合 Dim m As Variant Dim moji As String m=Array("aa","bb","cc","dd",・・・) moji=m(1) とすれば"bb"がmojiに代入されるのはわかるのですが これを二次元配列(3行4列)にする場合どのように 宣言(Dim~や、Array~)等はどのように記述すればよろしいですか? 基本的な質問でごめんなさい。 よろしくお願いします。