You may find this useful. Copy and paste it onto a new script, change the top 3 lines settings to suit your need. This little snippet is very low lag without any scanning event.

string menu_message = "TYPE MESSAGE HERE"; // menu message
list menu_button = ["OK"]; // menu button, maximum 12 buttons e.g. ["button1","button2","button3"]
float reset_time = 60.0; // time in second to reset the menu available for the next person
//======= NO NEED TO CHANGE ANYTHING FROM HERE ==========
key avi = NULL_KEY; // who to use
integer menu_chan = -1; // channel to use in the menu
integer listen_num = -1; // menu listen event handler
//==============================================
create_menu(string menu_message,list menu_button)
{ // function used to create menu to "user", given a "menu_message" and "menu_button"
menu_chan = 0 - (integer)llFrand(2147483647);
listen_num = llListen(menu_chan,"", avi,""

;
llDialog(avi, menu_message, menu_button, menu_chan);
llSetTimerEvent(reset_time); // sec timer used to in case the "ignore" button is pressed or time out
}
//==============================================
default
{
state_entry()
{
llListenRemove(listen_num); // just to save resources
llSetTimerEvent(0.0); // stop the timer in case it crosses state
}
collision_start(integer num_detected)
{
avi = llDetectedKey(0);
state menu;
}
}
state menu
{
state_entry()
{
create_menu(menu_message,menu_button);
}
timer()
{
state default;
}
}