Just some minor things:
1. You should perhaps first check nKeyCode, instead of forwarding all keys to the skiprow method.
2. Why _screen.activeform? Isn't the active form thisform? thisform.keypress wouldn't get a keypress even, if it wasn't.
3. your first line could be abbreviated to lcGridname = "oOutlookMessageGrid_Single"
Because: using the full qualified name from thisform down to the gridcontainer you already use the name of each control of the containment hierarchy down to the controls name itself. If you'd change the name of the oOutlookMessageGrid_Single control, your code wouldn't work anymore, as you'd need to change it to lcGridname=thisform.oMainform.oTasks.cont2.onewname.name and so you don't have any reason to read out the name property in code to prevent code changes. Or put in another way: Any name change will need a code change anyway.
This all is about identifying the right control. As you seem to use a class of a grid within a container, you could add a property "controlid" to the class and let it be "=sys(2015)", then it'll get a unique id at runtime you can compare. Another way would be to compare UPPPER(thisform.name+"oMainform.oTasks.cont2.oOutlookMessageGrid_Single") against UPPER(SYS(1272,m.loActiveControl.parent.parent)). This will then compare the full name path. As you know there can be many controls with same name due to the vfp containment hierarchy names only need to be unique within the same container.
Bye, Olaf.