お世話になっております。
15分どころか1時間調べても解決できなかったため、質問させていただきます。
64ビット環境のWindows10でフォームアプリケーションを作成して、C#でローカルフック(対象はウインドウメッセージ)のテストをしています(WndProc メソッドのオーバーライドをせずSetWindowsHookExを使用したい、別のアプリケーション開発があるため。テストのためなので、アプリケーションとしてのロジックは適当です。OnActivated メソッドへコードを書いたのは、ウインドウが確実に作成されているであろうことを期待したためです)
次のようなコードで実行させると、OnActivatedイベントハンドラで Win32API の SetWindowsHookExは失敗し、"87" (ERROR_INVALID_PARAMETER) が表示され、失敗したことが分かります。
C#
1using System; 2using System.Windows.Forms; 3using System.Runtime.InteropServices; 4 5namespace WindowsFormsApplication1 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 } 13 protected override void OnActivated(EventArgs e) 14 { 15 base.OnActivated(e); 16 17 var ret = NativeMethods.SetWindowsHookEx(4, new NativeMethods.HookProc(Hook), IntPtr.Zero, (uint)System.Threading.Thread.CurrentThread.ManagedThreadId); // WH_CALLWNDPROC = 4 18 var hr = Marshal.GetLastWin32Error(); 19 20 MessageBox.Show(hr.ToString()); // 87 と表示されます 21 } 22 23 internal IntPtr Hook(int a, IntPtr b, IntPtr c) 24 { 25 // ここに来ません 26 return IntPtr.Zero; 27 } 28 29 } 30 internal class NativeMethods 31 { 32 [DllImport("user32.dll", SetLastError = true)] 33 public static extern IntPtr SetWindowsHookEx(int hookType, HookProc lpfn, IntPtr hMod, uint dwThreadId); 34 35 public delegate IntPtr HookProc(int code, IntPtr wParam, IntPtr lParam); 36 } 37}
SetWindowsHookEx のローカルフックでは、第三引数は0、第四引数にはスレッドIDを指定すると動くことを期待しているのですが、WindowsOSさんからするとパラメータが悪いようです。何がわるいのかご存知の方、ご教示いただけますでしょうか?
宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。