El keypress para esa finalidad es un poco complicado, aunque se puede usar.
Lo que normalmente se utiliza es el Evento InteractiveChange, de donde no necesitas construir una cadena de búsqueda porque tomas la que se escribió.
Por otra parte, te conviene utilizar una propiedad del formulario para evitar que el SET FILTER se te vaya de alcance y te aparezca un error de variable indefinida. La propiedad la puedes agregar en el diseñador de formularios. También por código, por ejemplo, Addproperty(thisform,"miFiltro","")
*<InteractiveChange Event>
thisform.miFiltro=alltrim(this.value)
SELECT TablaLibros
IF EMPTY(THISFORM.FILTRO)
SET FILTER TO
ELSE
SET FILTER TO NOMBREL=THISFORM.FILTRO
ENDIF
GO TOP
THISFORM.GRID1.REFRESH
De todos modos te comento que eso es solo para tu práctica.
Si quieres o necesitas aprender Visual Fox, lo mejor es olvidarse de SET FILTER (que solamente resulta utilizable en tablas locales y cursores) y aprender SELECT SQL.
Por ejemplo, qué tal si el cliente no recuerda el nombre completo de un libro. Te dice, por ejemplo, "busco un libro, no sé bién el título, algo de Venas Abiertas". Entonces el SET FILTER no te servirá de nada. En cambio, en la instrucción LIKE del comando SELECT SQL en la cláusula WHERE puedes poner que busque "Venas" en donde fuere dentro del campo.
Este modo de trabajar, te obligará a replantear la asociacion de un cursor al grid. Lo que hacemos, normalmente, es crear un cursor en el LOAD del form con la estructura que se terminará mostrando.
*<LOAD>
&& esto crea un cursor vacío con la estructura de la tabla "LIBROS"
SELECT * FROM LIBROS WHERE .F. INTO CURSOR curGeneral READWRITE
*<INIT> && o mejor, en un método que se ejecute en el Init del form.
En el textbox de búsqueda, evento InteractiveChange