- PR -

キーボードの自動入力について[C#]

投稿者投稿内容
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-08 08:28
引用:

シゲルさんの書き込み (2004-04-08 01:56) より:

あるのは、簡単に使えて、実際は使い物にならないSendKeyだけ・・・はぁ・・・


 SendKeyも、中はSendInputを呼んでいるだけ、つまりラッパーだと思いますよ。

 まぁ、暇があれば作ってみます。要はWin32APIのラッパーなので。
シゲル
常連さん
会議室デビュー日: 2004/04/03
投稿数: 27
投稿日時: 2004-04-08 08:42
引用:

Jittaさんの書き込み (2004-04-08 08:28) より:
 SendKeyも、中はSendInputを呼んでいるだけ、つまりラッパーだと思いますよ。

 まぁ、暇があれば作ってみます。要はWin32APIのラッパーなので。



気を取り直して、今日もSendInput解明に取り組もうと思います。(笑)
自信はないですが、自分の野生のカンを頼りにがんばります。

でも、作られたら、教えてください。


おさるさん
常連さん
会議室デビュー日: 2004/01/05
投稿数: 24
投稿日時: 2004-04-08 10:11
引用:

SendKeys.SendWait("^c");
SendKeys.Flush();

SendKeys.Send("^c");
SendKeys.Flush();




ちょっと気になる事ですがSendKeysの前にTargetのコントロールにFocusが
セットされているのでしょうか?
シゲル
常連さん
会議室デビュー日: 2004/04/03
投稿数: 27
投稿日時: 2004-04-08 10:49
引用:

おさるさんさんの書き込み (2004-04-08 10:11) より:
引用:

SendKeys.SendWait("^c");
SendKeys.Flush();

SendKeys.Send("^c");
SendKeys.Flush();




ちょっと気になる事ですがSendKeysの前にTargetのコントロールにFocusが
セットされているのでしょうか?



されているはずです。
というのは、SendKeyするのは、直前にアクティブだったウィンドウで、
そのウィンドウでは最後に何かの文字列を選択した状態だからです。
つまり、その文字列を[ctrl+c]することで、
クリップボードに転送したいのです。

はじめは、直前のウィンドウでフォーカスされている、
つまり、文字列が選択されているコントロールから
SelectedTextを使って、クリップボードに転送しようとおもったのですが、
なんだか難しそうなので、
[ctrl+c]で代用できないかと考えたわけです。

ひょっとして、こちらの方が簡単ですかね?



[ メッセージ編集済み 編集者: シゲル 編集日時 2004-04-08 10:55 ]
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-04-08 10:58
引用:

シゲルさんの書き込み (2004-04-08 10:49) より:

というのは、SendKeyするのは、直前にアクティブだったウィンドウで、
そのウィンドウでは最後に何かの文字列を選択した状態だからです。
つまり、その文字列を[ctrl+c]することで、
クリップボードに転送したいのです。


とすると、
引用:

シゲルさんの書き込み (2004-04-06 16:33) より:

C#で、フォーム内のボタンをクリックすると、


ですから、「実はボタンにフォーカスがある」のではないでしょうか?
ボタンを押した瞬間に、フォーカスはボタンに移りますから。
シゲル
常連さん
会議室デビュー日: 2004/04/03
投稿数: 27
投稿日時: 2004-04-08 11:09
引用:

ぢゃん♪さんの書き込み (2004-04-08 10:58) より:
とすると、
引用:

シゲルさんの書き込み (2004-04-06 16:33) より:

C#で、フォーム内のボタンをクリックすると、


ですから、「実はボタンにフォーカスがある」のではないでしょうか?
ボタンを押した瞬間に、フォーカスはボタンに移りますから。



ボタンを押した後にきちんと直前のウィンドウがアクティブになっています。
しかし、そのウィンドウ内で文字列を選択しているコントロールが
フォーカスされているかどうかについては不明ですが、
ただ、SendWait("^c")でもうまく行く場合はあるので、
その場合は少なくともフォーカスされているはずですよね。

ということは、直前のウィンドウをアクティブにするだけでは足りなくて、
そのウィンドウ内でアクティブだったコントロールに
明示的にフォーカスを当てるということが必要だということでしょうか?




[ メッセージ編集済み 編集者: シゲル 編集日時 2004-04-08 11:18 ]
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-04-08 11:16
引用:

シゲルさんの書き込み (2004-04-08 11:09) より:

ボタンを押した後にきちんと直前のウィンドウがアクティブになっています。


いえ、問題は「押した後」ではなく「押した瞬間」の方ですよ。
つまり、SendKeys.SendWaitを実行している瞬間に、どのウィンドウがアクティブで、どのコントロールにフォーカスがあるか、が関わってきます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-08 11:25
引用:

ぢゃん♪さんの書き込み (2004-04-08 11:16) より:

いえ、問題は「押した後」ではなく「押した瞬間」の方ですよ。


 いや、SendKeysでコントロールキーを扱ったときにおかしいような?
prvForm2.Activate();
prvForm2.GetReady(); // textBoxにフォーカスを移動させる
System.Windows.Forms.SendKeys.SendWait("{HOME}");
System.Windows.Forms.SendKeys.SendWait("+{END}");
System.Windows.Forms.SendKeys.SendWait("^C");
とすると、textBoxに入力している文字はすべて選択されるのですが、"^c"でフォームのフォーカスがロストします。このあと、マウスクリックでprvForm2をアクティブにすると、textBoxの入力が選択されています。

 と、ふと疑問を感じて、
System.Windows.Forms.SendKeys.SendWait("^C");
を、
System.Windows.Forms.SendKeys.SendWait("^c");
とすると、うまく動いた。そういうこと!?

追加:
違いがよくわからないね 大文字だったのを、小文字に変えると、きちんと動作しました。


PG追加:
コード:

public class Form1 : System.Windows.Forms.Form
{
private Form2 prvForm2;
private System.Windows.Forms.Button button5;
(略)
private void button5_Click(object sender, System.EventArgs e) {
if (prvForm2 == null) {
prvForm2 = new Form2();
prvForm2.Closed += new EventHandler(prvForm2_Closed);
prvForm2.Show();
return;
}

// フォーム2のテキストボックス1にフォーカス移動
prvForm2.GetReady();
// キャレットを先頭に移動
System.Windows.Forms.SendKeys.SendWait("{HOME}");
// すべて選択
System.Windows.Forms.SendKeys.SendWait("+{END}");
// クリップボードにコピー
System.Windows.Forms.SendKeys.SendWait("^c");
// テキストボックス2へ移動
System.Windows.Forms.SendKeys.SendWait("{TAB}");
// ペースト
System.Windows.Forms.SendKeys.SendWait("^v");
// とりあえず分けているが、
// "{HOME}+{END}^c{TAB}^v" でもよい
}

private void prvForm2_Closed(object sender, EventArgs e) {
// 後始末
prvForm2 = null;
}
}

public class Form2 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.TextBox textBox2;
(略)
public void GetReady() {
this.Activate();
textBox2.Text = "";
textBox1.Focus();
}
}



[ メッセージ編集済み 編集者: Jitta 編集日時 2004-04-08 11:53 ]

スキルアップ/キャリアアップ(JOB@IT)