OK, it seems your script has to work in some weird circumstances

.
I hope this is your situation now. It works on the same (WinXP SP1)
Code:
AlreadyDown1= Already
Dn:= GetkeyState("RButton","P")
If Dn
Gosub, Rbutton
Hotkey, Rbutton Up, Rbutton_Up
Hotkey, Rbutton, Rbutton
Hotkey, F10, ExitApp
Return
Rbutton:
If Dn
Hotkey, Rbutton Up, Rbutton_Up
MsgBox, % "You hold RButton Down " AlreadyDown%Dn% "!"
If Dn
Dn:= false
Return
Rbutton_Up:
; If DnWasTrueBefore
; Send, {Rbutton Up} ; "necessary" if Rbutton was down before script start
MsgBox, You keep RButton Up Again!
Return
ExitApp:
ExitApp
Return
It works but some funny things happening after the script has been running. E.g. my browser has unwanted behaviour when rolling the mouse wheel. Solution: There's a
Send, {Rbutton Up} somewhere needed, if Rbutton was pressed before the script started. I don't know for your situation whether that
Send {Rbutton Up} give some problem?