新生活!引っ越してから困らないように注意すべきことは?>>

VB.net/C# .NET Framework 2.0で開発しております。
いま、Panel等コンテナコントロールの上に子コントロールが乗っているとして、この時子コントロールの指定したイベントが発生した際に、親コンテナの同じイベントを発生させたいと思っていますが、なかなかスマートなやり方が見つからずに悩んでおります。
子配置の際にAddHandler等でごりごりイベントハンドラを指定しまくれば、出来ることはできるのですが…それ以外のやり方としてどんなものがあるのか、知りたくなって質問させていただきました。
GUIの開発においてこういった要望はそれなりにあると思うのですが、皆様はどのようにして解決してらっしゃるのでしょうか?
ご教示下さい。

A 回答 (2件)

そうですね プロパティの変更でそのような動きとなると子コントールの派生クラスを作って親のハンドラを呼ぶようにしないといけないかと



少々趣は違いますが FormクラスのKeyPreviewプロパティのような動きということでしょうか ・・・

WndProcをオーバーライドするか、個々のProtectedイベントで親イベントをコールするような方向かと
    • good
    • 0

同じ処理になるものは関数化しておいて、


全ての同じ処理させるイベント関数でその関数を呼ぶ。

ぐらいにしか思いつきませんが?

この回答への補足

すみません、補足を付けるべき所を誤ってお礼をつけてしまいました。

補足日時:2009/06/14 10:33
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。説明が悪かったかもしれません。イベントハンドラ割り当ての部分をどうにかして自動化できないか、という点についてお聞きしたいです。例えばリフレクションを活用することによってイベント割り当てを自動化できないかなどと考えてもみましたが、このために実行時負担をかけるのもどうかなと思いまして…

つまり実現したいことは、
1.親コンテナの上に子コントロールを配置した状態で
2.子の特定のプロパティを変更する、等の簡単な操作だけで、
3.子のClickイベントが自動的に親のClickイベントハンドラに割り当てられる
です。

宜しくお願い致します。

お礼日時:2009/06/14 10:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC#で親にイベントを投げる方法

すごく基本的なことかもしれないのですが、ポインタだけでも良いので教えてください。

あるFormにPictureBoxをはりつけてあります。
PictureBoxをマウスでクリックしたときにpictureBox_Click()イベントが発生しますが、このイベントをそのままスルーして、Formに伝えてあげたいのです。
pictureBox.Parent.OnMouseDown()とでもすればいいのかと思っていたのですが、コンパイルエラーでした。
何かすごい勘違いをしているような気もするのですが、お恥ずかしいことに何が悪いのかよくわかりません。ポインタだけでも良いので、どうすれば親にイベントを投げられるのかを教えてください。

Aベストアンサー

>Formに伝えてあげたいのです
この言葉がなにを意味しているのかはよくわかりませんが。

もし、Formオブジェクト上で定義したメソッドを
呼ぶようにしたいという話なら簡単です。

Formのクラスの中に、
PictureBox1という名前のPictureBox型のメンバー変数があったとします。
Formのクラスの中に、
PictureBox1_Click()というメソッドがあったとします。
初期処理のどこかで、
PictureBox1.OnClick +=
new ○○EventHandler(PictureBox1_Click);
の記述があれば、
PictureBox1からClickイベントが発生した時、
つまり、画面上でクリックされたときに、
Formクラスにある
PictureBox1_Click()メソッドが呼ばれます。
PictureBox1_Click()メソッドはFormクラスの
メソッドなので、その定義の中でのthisは
フォームオブジェクトそのものです。
そうやってフォームオブジェクトにアクセスできます。

なお、この

PictureBox1.OnClick +=
new ○○EventHandler(PictureBox1_Click);

のコードはVisual Studioのデザイナで
PictureBox1のイベントハンドラを登録すると、
InitialComponent()などというメソッドに
(名前ははっきり覚えてません)勝手に追加されます。
本当は別にどこでもよいです。
初期化処理のところで自分で手で追加しても同じことです。


ご質問ないようは、これでよろしかったでしょうか?

ちなみに、
pictureBox.Parent.OnMouseDown()
ですが、
pictureBox.Parentは
コントロールや、コンテナ型のようなものが
返却されるかと、そのオブジェクトは
OnMouseDownというメソッドは保有していないでしょう。
pictureBox.Parentが貴方が定義した
Formクラスの派生クラスということは、
PictureBoxにはわからないことです。


ご質問内容がいまいちよくわからないので、
想像で勝手に回答しましたが、
勘違いしているようであれば、すいません。

以上です。

>Formに伝えてあげたいのです
この言葉がなにを意味しているのかはよくわかりませんが。

もし、Formオブジェクト上で定義したメソッドを
呼ぶようにしたいという話なら簡単です。

Formのクラスの中に、
PictureBox1という名前のPictureBox型のメンバー変数があったとします。
Formのクラスの中に、
PictureBox1_Click()というメソッドがあったとします。
初期処理のどこかで、
PictureBox1.OnClick +=
new ○○EventHandler(PictureBox1_Click);
の記述があれば、
PictureBox1からClickイベントが...続きを読む

QC# ユーザコントロール内のボタン押下を親で知る

こんにちは。ユーザーコントロール内のボタンをクリックした時、そのユーザーコントロールをおいている親フォーム側で、それを知るにはどのようにすればよいでしょうか?

----------------------------------------------------------------------
[Form1.cs]

void Inform_UserControlButton1Click()
{
//親が持っている変数を使って処理を行いたい
}

void Form1_Load(....)
{
//ユーザコントロールを設置
UserControl1 ctrl = new UserControl1();
this.Controls.Add(ctrl);

  //ユーザコントロール内のbutton1を見つける
List<Control> ctrl = new List<Control>(cps.Controls.Find("button1", false));

//Form1が持っている変数を使う為の関数を通るようにしたい
(Button)ctrl[0].Click += new System.EventHandler(Inform_UserControlButton1Click); //←エラー
}
----------------------------------------------------------------------
[UserControl.cs]
button1が配置されています。

----------------------------------------------------------------------
こんな感じにしてできないかなー?と思っていたのですが、//←エラーのところで、

イベント 'System.Windows.Forms.Control.Click' は += または -= の左側にのみ表示されます。

となってしまい上手くいきません。
どのようにすればよいでしょうか?

こんにちは。ユーザーコントロール内のボタンをクリックした時、そのユーザーコントロールをおいている親フォーム側で、それを知るにはどのようにすればよいでしょうか?

----------------------------------------------------------------------
[Form1.cs]

void Inform_UserControlButton1Click()
{
//親が持っている変数を使って処理を行いたい
}

void Form1_Load(....)
{
//ユーザコントロールを設置
UserControl1 ctrl = new UserControl1();
this.Controls.Add(ctrl);

  //ユーザコ...続きを読む

Aベストアンサー

> ((Button)ctrl[0]).Click += new EventHandler(Inform_UserControlButton1Click);
> では、+=の左側にだけ~・・・というエラーが出ます。

えっと、動いたものを貼り付けたので、コンパイルエラーにはならないはずです。

で、上記コードは、質問時の記述だと左辺が
(Button)ctrl[0].Click
となっていると思います。これだと確かにエラーになります。
しかし
((Button)ctrl[0]).Click
と、キャストを括弧で括って優先させるとエラーにならないと思いますが、
いかがでしょうか?

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QGetPrivateProfileStringでiniファイル読込む処理を詳しく知りたいのですが・・・

お世話になっています。

iniファイルを読込み、各変数に代入するC言語のDLLを作成したいのです。
このサイトの投稿や、MSDNなどにも載っていたのですが、
少し理解に苦しみます。

現在まで、理解した点がwindows.hのインクルードを
記述するところ辺りです。
iniファイルは下記のようなレイアウトです。

---<mst.ini>----------------------------
[user]
name=username
ID=userid
[pc]
pcname=FMV
----------------------------------------

#include<windows.h>は記述することまでは
分かりましたが、以下から進みません。。。

GetPrivateProfileString("")

初心者で申し訳ありませんが、お助け願います。

Aベストアンサー

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
                sizeof(strBuf),   // 上記のエリアのサイズ
                "mst.ini" );     // iniファイル名

解説:
iniファイル名をフルパスで指定しないとWindowsのディレクトリにあるものと判断されます。
Win9xなら「c:\windows」、WinNT系なら「c:\WinNT」。

[user]セクションのnameキーがないときは、デフォルト値で指定した値が設定させます。

復帰値「dwLen」は実際に設定した値(文字列)の長さが返されます。

こんにちは。itohhといいます。

サンプルを載せておきます。

mst.iniファイル内の[user]セクションのnameキーの値を取得する。
DWORD dwLen=0;
char strBuf[100];
dwLen = GetPrivateProfileString("user",       // セクション名
                "name",       // キー名
                "soushi_ni",     // デフォルト値
                strBuf,       // 読み込んだ値を格納するエリア
             ...続きを読む

QVB.NETで他のプロジェクトで作成したフォームを使う方法

こんにちは。
VB.NETのプロジェクトがぐちゃぐちゃで参照設定とかいろんなの呼んでしまっているので、新しく作成しなおしたいのですが、
新しいプロジェクトでプロジェクトを作成し、前のプロジェクトで必要なファイル(.vb、RESX)を新しいプロジェクトのフォルダにコピーしたのですが、
普通のモジュールは追加>新しい項目の追加でなんとか追加できたのですが、フォームの追加の仕方がわかりません><教えてくださいー

P.S. RESXファイルってフォームのデータが入ってるのでしょうか?そんな気がしてコピーしたのですが。

※VB6.0からVB.NETに以降した際にアップデート情報みたいなのがプログラム上にくっついてしまって.vbファイルも参照項目も増えまくってしまった

Aベストアンサー

ドラッグ&ドロップが使いやすい。
Windowsのエクスプローラでvbファイルをドラッグして、VS.NETのソリューションエクスプローラへドロップする。

QC# 子のコントロールからイベントを送る方法?

毎度お世話になっております。

何の手も加えていないフォームに自分で作った
ユーザコントロールを張り付け、そのコントロールからイベントが
発生したら、親フォームを閉じるようにしたいと思っています。

下記にサンプルを記述します。

フォーム側(using文、Designer文は省略)

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private string[] stLines =
{
"こんにちは。",
"こんばんは。",
"おはよう。",
"さようなら。",
"おやすみなさい。",
};
public Form1()
{
InitializeComponent();  // 省略

JLabel j = new JLabel(stLines);
j.Dock = DockStyle.Fill;
this.Controls.Add(j);
}
}
}

ユーザコントロール側(Labelを継承)

namespace WindowsFormsApplication1
{
public class JLabel : Label
{
private string[] stLines = null;
private int lineNo = 0;

public JLabel(string[] Lines)
{
this.Click += new System.EventHandler(this.Jlabel_Click);
this.stLines = Lines;
this.lineNo = 0;
}
private void Jlabel_Click(object sender, EventArgs e)
{
this.lineNo++;
if (this.stLines.Length > this.lineNo)
{
this.Text = this.stLines[this.lineNo];
}
else
{
//ここでイベントを発生させたい
//this.lineNo = 0;
}
}
}
}

上記のように、渡された文字列をもとに、クリックするごとに次の行を
表示するプログラムですが、行番号が行数を超えた場合にイベントを
発生させて、それを親のフォームが監視し、受け取った際にフォームを
閉じるといった処理をさせたいのです。

親のフォームにクリックイベントを仕掛ければ楽ではありますが、
子供のコントロールからの信号を、親が受け取る…といった流れにしたいのです。

以上、よろしくお願いいたします。

毎度お世話になっております。

何の手も加えていないフォームに自分で作った
ユーザコントロールを張り付け、そのコントロールからイベントが
発生したら、親フォームを閉じるようにしたいと思っています。

下記にサンプルを記述します。

フォーム側(using文、Designer文は省略)

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
private string[] stLines =
{
"こんにちは。",
"こんばんは。",
"おはよう。",
...続きを読む

Aベストアンサー

C#の文法書を読めば,イベントの作成方法は書いていませんか。

推奨される手順は,次のような感じでしょうか。
・イベントをメンバーとして定義する
public event EventHandler Foo;
・イベントを呼び出すメソッドを定義する
protected virtual void OnFoo (EventArgs e)
{
if (Foo != null)
{
Foo(this, e);
}
}
あとは,イベントを発生させたいところでOnFooを呼び出せばよいです。
イベント引数に情報を載せたいのであれば,EventArgsを派生させたHogeEventArgsを用意して,
イベントの型をEventHadnler<HogeEventArgs>にします。
ref) http://msdn.microsoft.com/ja-jp/library/vstudio/w369ty8x(v=vs.110).aspx
ref) http://msdn.microsoft.com/ja-jp/library/vstudio/hy3sefw3(v=vs.110).aspx

C#の文法書を読めば,イベントの作成方法は書いていませんか。

推奨される手順は,次のような感じでしょうか。
・イベントをメンバーとして定義する
public event EventHandler Foo;
・イベントを呼び出すメソッドを定義する
protected virtual void OnFoo (EventArgs e)
{
if (Foo != null)
{
Foo(this, e);
}
}
あとは,イベントを発生させたいところでOnFooを呼び出せばよいです。
イベント引数に情報を載せたいのであれば,EventArgsを派生させたHogeEventArgsを用意して,
イベントの型をEventHad...続きを読む

Qフルパスから最後のディレクトリ名を取得したい。

vb.netなのですが、例えば
c:\aaa\bbb\ccc\ddd\eee\fff.exe
というフルパスがあったとして、
eeeというディレクトリ名を取得したいのですが、
何か良い方法はないでしょうか。
それぞれのディレクトリ名の文字数や階層数は
決まっていないのですが、オススメの方法が
ありましたら、教えて頂けると助かります。

Aベストアンサー

MessageBox.Show(IO.Path.GetFileName(IO.Path.GetDirectoryName(myPath)))

IO.Path の GetDirectoryName でフォルダのフルパスを取得して、さらに IO.Path の GetFileName で最終フォルダ(またはファイル)の名前を取得。

QListViewコントロールでサムネイル画像を一覧表示するには?

VB初心者です。
.NET TIPSの中に「ListViewコントロールでサムネイル画像を一覧表示するには?」というものがありました
今回、それを利用してサムネイル一覧の表示をしようとして行き詰りました。

作りたいのは以下のものです
○決まったサイズの画像(bitmap)を表示し、その下にファイル名(フルパスでは無い)を表示し、更にその下に元の画像のサイズを表示するようなものを作成したいのですが、作成可能でしょうか?
また、作成可能な場合、どういった方法で作成したら良いか教えて下さい。
行き詰ったのは、第一段階の、サムネイル画像のしたのファイル名の所です。
よく分からずに
ListView1.Items.Add(bmpFiles(i), i)の所を
Dim bmpFileName As String = _
Path.GetFileNameWithoutExtension(bmpFiles(i))
ListView1.Items.Add(bmpFileName)
bmpFileName(ファイル名のみ)に変更したら、ファイル名は表示されるのですが、画像が表示されませんでした。

次に両方書いたのですが画像の下にフルパスその横にファイル名が表示されます。
Dim bmpFileName As String = _
Path.GetFileNameWithoutExtension(bmpFiles(i))
ListView1.Items.Add(bmpFiles(i), i)
ListView1.Items.Add(bmpFileName)
色々調べてみたのですが、思ったような記述が無かったのでここで質問させて頂きました。
拙い質問なので分かり難いかと思いますがアドバイスをよろしくお願いいたします。

VB初心者です。
.NET TIPSの中に「ListViewコントロールでサムネイル画像を一覧表示するには?」というものがありました
今回、それを利用してサムネイル一覧の表示をしようとして行き詰りました。

作りたいのは以下のものです
○決まったサイズの画像(bitmap)を表示し、その下にファイル名(フルパスでは無い)を表示し、更にその下に元の画像のサイズを表示するようなものを作成したいのですが、作成可能でしょうか?
また、作成可能な場合、どういった方法で作成したら良いか教えて下さい。
行き詰っ...続きを読む

Aベストアンサー

n-junです。

画像を表示して、そこにファイル名と画像の(幅と高さ)を表示でしょうか?

ListView1.Items.Add(System.IO.Path.GetFileName(jpgFiles(i)) & vbLf & "幅:" & original.Width _
& " 高さ:" & original.Height, i)

こんな感じなら出来ましたけど、どうでしょう?

QPreviewKeyDownイベントが2回発生する

現在WindowsXP上でVB2005で開発を行っています。
タイトルの通りなのですがPreviewKeyDownイベントが2回発生してしまって困っています。簡易なコードを下記に記します。

Private Sub WebBrowser1_PreviewKeyDown(ByVal sender As Object,ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs)Handles WebBrowser1.PreviewKeyDown

My.Computer.Audio.Play(" My.Computer.Audio.Play("C:\WINDOWS\Media\Windows XP Shutdown.wav", AudioPlayMode.WaitToComplete)

End Sub

というコードを書いたところ、WEBブラウザ上で何かキーを押すと2回、waveファイルが再生されてしまいます。違うwaveファイルでも試しましたが同じでした。ですのでファイルの長さ等は関係ないようです。
原因はpreviewKeyDown以外に考えられないのですが、対処法がわかりません。何かよいアイデアはないでしょうか?

現在WindowsXP上でVB2005で開発を行っています。
タイトルの通りなのですがPreviewKeyDownイベントが2回発生してしまって困っています。簡易なコードを下記に記します。

Private Sub WebBrowser1_PreviewKeyDown(ByVal sender As Object,ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs)Handles WebBrowser1.PreviewKeyDown

My.Computer.Audio.Play(" My.Computer.Audio.Play("C:\WINDOWS\Media\Windows XP Shutdown.wav", AudioPlayMode.WaitToComplete)

End Sub
...続きを読む

Aベストアンサー

なるほど、知りませんでした。確かに WebBrowser コントロールの KeyDown は使用できないようになっているようですね。それで PreviewKeyDown を使われていると。

私のところでもページを読み込ませてみたところ再現しました。で、これについていろいろ調べてみて、以下のような MSDN フォーラムのスレッドを見つけました。

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/f83d3d71-ea3e-4b18-a610-30a91fae060e/
ここではおそらくバグだろうという結論で、フラグを使って回避しているようです。

また、試してみたところ、PreviewKeyDown の中で e.IsInputKey = True を書くと、2回目の PreviewKeyDown は発生しないこともわかりました。

フラグを使って回避していると、もしこれがバグで、将来の .NET Framework のバージョンアップで修正されたときに動かなくなってしまう可能性もありますし、IsInputKey の方で対処するほうがよいのではないかと思います。一応 IsInputKey の意味的にも間違っていない使い方ですし。

この現象については、バグの可能性もあると思うので、MSDN フォーラムにフィードバックとして投稿してみるとよいと思います。

http://forums.microsoft.com/MSDN-JA/ShowForum.aspx?ForumID=183&SiteID=7

なるほど、知りませんでした。確かに WebBrowser コントロールの KeyDown は使用できないようになっているようですね。それで PreviewKeyDown を使われていると。

私のところでもページを読み込ませてみたところ再現しました。で、これについていろいろ調べてみて、以下のような MSDN フォーラムのスレッドを見つけました。

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/f83d3d71-ea3e-4b18-a610-30a91fae060e/
ここではおそらくバグだろうという結論で、フラグを使って回避してい...続きを読む

QVB.NETでマウスクリックイベントを発生させたい。

VB.NETでformの外で任意の座標でマウスクリックイベントを発生させたい。
formにはボタンがあり、そのボタンを押すを固定位置(formの外)でマウスの左クリックイベントを発生させたいのですがどのような手段を使えばいいでしょうか。

環境 Windows XP,VB2008 Exoress

Aベストアンサー

こちらの記事がわかりやすくていいんじゃないかなー。
http://blog.livedoor.jp/akf0/archives/51560984.html


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング