Arrows keys are managed by controls in WM_GETDLGCODE message Then you can handle this message in the control or WM_KEYDOWN/WM_KEYUP
For example, a test with WM_KEYDOWN:
public partial class MYTextBox : TextBox
{
public MYTextBox()
{
}
public const int WM_KEYDOWN = 0x0100;
public const int WM_KEYUP = 0x0101;
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
if (m.Msg == WM_KEYDOWN)
{
if (m.WParam == (IntPtr)Keys.Left || m.WParam == (IntPtr)Keys.Right)
Console.Beep(5000, 10);
m.Result = IntPtr.Zero;
}
}
}