|
■No67970 (なお さん) に返信
> 但し、以下の件はメールでご回答したとおりの内容になります。PostMessage直前までは非0です。
手元の環境では、Zero クリアされる現象を再現できていません。
どなたかとメールでやりとりしていた内容があるなら、その情報も共有していただけないでしょうか?
> GetWindowで取得した子ウィンドウのハンドルをポスト先にすると、ハンドルが0になります。
GetWindow してから PostMessage されるまでの間に、ウィンドウが破棄あるいは再生成されているとか…?
だとしても、e はまだしも d まで Zero になる状況になるとは思えないですし。
GW_CHILD で得た値を PostMessage するまでの間に、何か追加の処理を行っていたりはしますか?
> ポスト先ウィンドウのハンドルを親ウィンドウにするとハンドルは非ゼロ(正しい)で動作しました。
対象となるコントロールウィンドウに対してポストすべき場合と、
その親コントロールあるいはトップレベルウィンドウに対して
ポストすべき場合とがあります。
どちらを用いるべきかは、対象アプリの実装次第でしょうね。
// -------------
public class F : Form {
private TextBox textBox1 = new TextBox();
public F() {
Controls.Add(textBox1);
textBox1.KeyDown += (object sender, KeyEventArgs e) => {
if (e.KeyCode == Keys.F5) {
Console.WriteLine("F[{0:X}].TextBox[{1:X}].KeyDown", (Int64)this.Handle, (Int64)textBox1.Handle);
}
};
KeyDown += (object sender, KeyEventArgs e) => {
if (e.KeyCode == Keys.F5) {
Console.WriteLine("F[{0:X}].KeyDown", (Int64)this.Handle);
}
};
}
}
// -------------
var f1 = new F() { KeyPreview = true , Text = "F1:true" };
var f2 = new F() { KeyPreview = false, Text = "F2:false" };
f1.Show();
f2.Show();
// -------------
foreach (IntPtr ptr in new IntPtr[] {
f1.Handle, f2.Handle, f1.Controls[0].Handle, f2.Controls[0].Handle})
{
var ret = PostMessage(ptr, WM_KEYDOWN, (IntPtr)VK_F5, IntPtr.Zero);
Console.WriteLine("ret={0}, ptr={1}", ret, ptr);
}
|