截获DataGridView的Tab键问题,急急急!谢谢!

cuiyonghua 2012-09-06 10:41:25
情况如下:有一个TabControl控件,有3个Page,每个Page中有一个DataGridView控件,每个DataGridView都要求最后1行自动添加1个新行,我现在的情况是,在第1个DataGridView中,用Tab键跳到新行后,就不往下跳了,我想要的效果是,当跳到第1个DataGridView新行(也就是最后1行)时,再按Tab键,我就让TabControl跳到第2个Page,并且第2个DataGridView获得焦点。现在关键问题是,在DataGridView获得焦点后,Tab键、Enter键是让DataGridView处理的,窗体上截获不了Tab键,请问有知道怎么处理的吗?

我现在是使用钩子函数来做的,但是,使用这个又有个问题,在我的钩子回调函数中,无法使用DataGridView控件的实例。
代码如下:

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool UnhookWindowsHookEx(IntPtr hhk);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);

[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern IntPtr GetModuleHandle(string lpModuleName);

private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);

private const int WH_KEYBOARD_LL = 13;
private const int WM_KEYDOWN = 0x0100;
private static LowLevelKeyboardProc _proc = HookCallback;
private static IntPtr _hookID = IntPtr.Zero;

private static IntPtr SetHook(LowLevelKeyboardProc proc)
{
using(Process curProcess=Process.GetCurrentProcess())
using (ProcessModule curModule = curProcess.MainModule)
{
return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0);
}
}


private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
//if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
//{
// int vkCode = Marshal.ReadInt32(lParam);
// MessageBox.Show(((Keys)vkCode).ToString());

//}

int vkCode = Marshal.ReadInt32(lParam);
if (((Keys)vkCode) == Keys.Tab)
{
if(grid..........)
{

}
}
return CallNextHookEx(_hookID, nCode, wParam, lParam);


}

就是在if(grid.......)这儿,想判断DataGridView的最后一行,但是现在在这个函数中找不到grid这个变量。
...全文
220 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cuiyonghua 2012-09-06
  • 打赏
  • 举报
回复
怎么实现局部钩子?
cuiyonghua 2012-09-06
  • 打赏
  • 举报
回复
知道了,犯了个很二的错误,上面的函数是static,不写成这个就可以了。
cuiyonghua 2012-09-06
  • 打赏
  • 举报
回复
你在KeyDown事件中截获Tab键试试?
bdmh 2012-09-06
  • 打赏
  • 举报
回复
这还用钩子?grid的keydown或keypress中判断,如果是tab并且是最后一行,就切换,如果这里不好捕获,还可以用过滤器捕获消息(IMessageFilter)
cuiyonghua 2012-09-06
  • 打赏
  • 举报
回复
没用的,请问如何实现一个局部钩子?
thy442030800 2012-09-06
  • 打赏
  • 举报
回复
直接设置tab index有用吗?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧