Implemented basic handling of assessibility actions.

diff --git a/include/winuser.h b/include/winuser.h
index 68434e0..c8b4527 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -62,6 +62,169 @@
 
 typedef HANDLE HDWP;
 
+/* flags for FILTERKEYS dwFlags field */
+#define FKF_AVAILABLE       0x00000002
+#define FKF_CLICKON         0x00000040
+#define FKF_FILTERKEYSON    0x00000001
+#define FKF_HOTKEYACTIVE    0x00000004
+#define FKF_HOTKEYSOUND     0x00000010
+#define FKF_CONFIRMHOTKEY   0x00000008
+#define FKF_INDICATOR       0x00000020
+
+typedef struct tagFILTERKEYS
+{
+    UINT   cbSize;
+    DWORD  dwFlags;
+    DWORD  iWaitMSec;
+    DWORD  iDelayMSec;
+    DWORD  iRepeatMSec;
+    DWORD  iBounceMSec;
+} FILTERKEYS, *PFILTERKEYS, *LPFILTERKEYS;
+
+/* flags for TOGGLEKEYS dwFlags field */
+#define TKF_AVAILABLE       0x00000002
+#define TKF_CONFIRMHOTKEY   0x00000008
+#define TKF_HOTKEYACTIVE    0x00000004
+#define TKF_HOTKEYSOUND     0x00000010
+#define TKF_TOGGLEKEYSON    0x00000001
+
+typedef struct tagTOGGLEKEYS
+{
+    DWORD   cbSize;
+    DWORD   dwFlags;
+} TOGGLEKEYS, *PTOGGLEKEYS, *LPTOGGLEKEYS;
+
+/* flags for MOUSEKEYS dwFlags field */
+#define MKF_AVAILABLE       0x00000002
+#define MKF_CONFIRMHOTKEY   0x00000008
+#define MKF_HOTKEYACTIVE    0x00000004
+#define MKF_HOTKEYSOUND     0x00000010
+#define MKF_INDICATOR       0x00000020
+#define MKF_MOUSEKEYSON     0x00000001
+#define MKF_MODIFIERS       0x00000040
+#define MKF_REPLACENUMBERS  0x00000080
+
+typedef struct tagMOUSEKEYS
+{
+    UINT    cbSize;
+    DWORD   dwFlags;
+    DWORD   iMaxSpeed;
+    DWORD   iTimeToMaxSpeed;
+    DWORD   iCtrlSpeed;
+    DWORD   dwReserved1;
+    DWORD   dwReserved2;
+} MOUSEKEYS, *PMOUSEKEYS, *LPMOUSEKEYS;
+
+/* flags for STICKYKEYS dwFlags field */
+#define SKF_AUDIBLEFEEDBACK 0x00000040
+#define SKF_AVAILABLE       0x00000002
+#define SKF_CONFIRMHOTKEY   0x00000008
+#define SKF_HOTKEYACTIVE    0x00000004
+#define SKF_HOTKEYSOUND     0x00000010
+#define SKF_INDICATOR       0x00000020
+#define SKF_STICKYKEYSON    0x00000001
+#define SKF_TRISTATE        0x00000080
+#define SKF_TWOKEYSOFF      0x00000100
+
+typedef struct tagSTICKYKEYS
+{
+    DWORD   cbSize;
+    DWORD   dwFlags;
+} STICKYKEYS, *PSTICKYKEYS, *LPSTICKYKEYS;
+
+/* flags for ACCESSTIMEOUT dwFlags field */
+#define ATF_ONOFFFEEDBACK   0x00000002
+#define ATF_AVAILABLE       0x00000004
+#define ATF_TIMEOUTON       0x00000001
+
+typedef struct tagACCESSTIMEOUT
+{
+    UINT    cbSize;
+    DWORD   dwFlags;
+    DWORD   iTimeOutMSec;
+} ACCESSTIMEOUT, *PACCESSTIMEOUT, *LPACCESSTIMEOUT;
+
+/* flags for SERIALKEYS dwFlags field */
+#define SERKF_ACTIVE        0x00000008
+#define SERKF_AVAILABLE     0x00000002
+#define SERKF_INDICATOR     0x00000004
+#define SERKF_SERIALKEYSON  0x00000001
+
+typedef struct tagSERIALKEYSA
+{
+    UINT  cbSize;
+    DWORD  dwFlags;
+    LPSTR  lpszActivePort;
+    LPSTR  lpszPort;
+    UINT  iBaudRate;
+    UINT  iPortState;
+    UINT  iActive;
+} SERIALKEYSA, *LPSERIALKEYSA;
+
+typedef struct tagSERIALKEYSW {
+    UINT  cbSize;
+    DWORD   dwFlags;
+    LPWSTR  lpszActivePort;
+    LPWSTR  lpszPort;
+    UINT   iBaudRate;
+    UINT   iPortState;
+    UINT   iActive;
+} SERIALKEYSW,*LPSERIALKEYSW;
+
+DECL_WINELIB_TYPE_AW(SERIALKEYS)
+DECL_WINELIB_TYPE_AW(LPSERIALKEYS)
+
+/* flags for SOUNDSENTRY dwFlags field */
+#define SSF_AVAILABLE       0x00000002
+#define SSF_SOUNDSENTRYON   0x00000001
+
+#define SSTF_BORDER         0x00000002
+#define SSTF_CHARS          0x00000001
+#define SSTF_DISPLAY        0x00000003
+#define SSTF_NONE           0x00000000
+
+#define SSGF_DISPLAY        0x00000003
+#define SSGF_NONE           0x00000000
+
+#define SSWF_DISPLAY        0x00000003
+#define SSWF_NONE           0x00000000
+#define SSWF_TITLE          0x00000001
+#define SSWF_WINDOW         0x00000002
+
+typedef struct tagSOUNDSENTRYA
+{
+    UINT  cbSize;
+    DWORD  dwFlags;
+    DWORD  iFSTextEffect;
+    DWORD  iFSTextEffectMSec;
+    DWORD  iFSTextEffectColorBits;
+    DWORD  iFSGrafEffect;
+    DWORD  iFSGrafEffectMSec;
+    DWORD  iFSGrafEffectColor;
+    DWORD  iWindowsEffect;
+    DWORD  iWindowsEffectMSec;
+    LPSTR  lpszWindowsEffectDLL;
+    DWORD  iWindowsEffectOrdinal;
+} SOUNDSENTRYA, *LPSOUNDSENTRYA;
+
+typedef struct tagSOUNDSENTRYW
+{
+    UINT  cbSize;
+    DWORD  dwFlags;
+    DWORD  iFSTextEffect;
+    DWORD  iFSTextEffectMSec;
+    DWORD  iFSTextEffectColorBits;
+    DWORD  iFSGrafEffect;
+    DWORD  iFSGrafEffectMSec;
+    DWORD  iFSGrafEffectColor;
+    DWORD  iWindowsEffect;
+    DWORD  iWindowsEffectMSec;
+    LPWSTR  lpszWindowsEffectDLL;
+    DWORD  iWindowsEffectOrdinal;
+} SOUNDSENTRYW, *LPSOUNDSENTRYW;
+
+DECL_WINELIB_TYPE_AW(SOUNDSENTRY)
+DECL_WINELIB_TYPE_AW(LPSOUNDSENTRY)
 
 /* flags for HIGHCONTRAST dwFlags field */
 #define HCF_HIGHCONTRASTON  0x00000001
@@ -98,7 +261,6 @@
     HWND  hwnd;
 } EVENTMSG, *PEVENTMSG, *LPEVENTMSG;
 
-
 /* WH_KEYBOARD_LL structure */
 typedef struct tagKBDLLHOOKSTRUCT
 {
diff --git a/windows/sysparams.c b/windows/sysparams.c
index f1eb884..80b991e 100644
--- a/windows/sysparams.c
+++ b/windows/sysparams.c
@@ -1255,12 +1255,66 @@
 
     WINE_SPI_FIXME(SPI_SETPENWINDOWS);		/*     49  WINVER >= 0x400 */
 
-    WINE_SPI_FIXME(SPI_GETFILTERKEYS);		/*     50 */
+    case SPI_GETFILTERKEYS:                     /*     50 */
+    {
+        LPFILTERKEYS lpFilterKeys = (LPFILTERKEYS)pvParam;
+        WARN("SPI_GETFILTERKEYS not fully implemented\n");
+        if (lpFilterKeys->cbSize == sizeof(FILTERKEYS))
+        {
+            /* Indicate that no FilterKeys feature available */
+            lpFilterKeys->dwFlags = 0;
+            lpFilterKeys->iWaitMSec = 0;
+            lpFilterKeys->iDelayMSec = 0;
+            lpFilterKeys->iRepeatMSec = 0;
+            lpFilterKeys->iBounceMSec = 0;
+         }
+        else
+        {
+            ret = FALSE;
+        }
+        break;
+    }
     WINE_SPI_FIXME(SPI_SETFILTERKEYS);		/*     51 */
-    WINE_SPI_FIXME(SPI_GETTOGGLEKEYS);		/*     52 */
+
+    case SPI_GETTOGGLEKEYS:                     /*     52 */
+    {
+        LPTOGGLEKEYS lpToggleKeys = (LPTOGGLEKEYS)pvParam;
+        WARN("SPI_GETTOGGLEKEYS not fully implemented\n");
+        if (lpToggleKeys->cbSize == sizeof(TOGGLEKEYS))
+        {
+            /* Indicate that no ToggleKeys feature available */
+            lpToggleKeys->dwFlags = 0;
+        }
+        else
+        {
+            ret = FALSE;
+        }
+        break;
+    }
     WINE_SPI_FIXME(SPI_SETTOGGLEKEYS);		/*     53 */
-    WINE_SPI_FIXME(SPI_GETMOUSEKEYS);		/*     54 */
+
+    case SPI_GETMOUSEKEYS:                      /*     54 */
+    {
+        LPMOUSEKEYS lpMouseKeys = (LPMOUSEKEYS)pvParam;
+        WARN("SPI_GETMOUSEKEYS not fully implemented\n");
+        if (lpMouseKeys->cbSize == sizeof(MOUSEKEYS))
+        {
+            /* Indicate that no MouseKeys feature available */
+            lpMouseKeys->dwFlags = 0;
+            lpMouseKeys->iMaxSpeed = 360;
+            lpMouseKeys->iTimeToMaxSpeed = 1000;
+            lpMouseKeys->iCtrlSpeed = 0;
+            lpMouseKeys->dwReserved1 = 0;
+            lpMouseKeys->dwReserved2 = 0;
+        }
+        else
+        {
+            ret = FALSE;
+        }
+        break;
+    }
     WINE_SPI_FIXME(SPI_SETMOUSEKEYS);		/*     55 */
+
     case SPI_GETSHOWSOUNDS:			/*     56 */
         spi_idx = SPI_SETSHOWSOUNDS_IDX;
 
@@ -1297,15 +1351,88 @@
             ret = FALSE;
         break;
     }
-    WINE_SPI_FIXME(SPI_GETSTICKYKEYS);		/*     58 */
+
+    case SPI_GETSTICKYKEYS:                     /*     58 */
+    {
+        LPSTICKYKEYS lpStickyKeys = (LPSTICKYKEYS)pvParam;
+        WARN("SPI_GETSTICKYKEYS not fully implemented\n");
+        if (lpStickyKeys->cbSize == sizeof(STICKYKEYS))
+        {
+            /* Indicate that no StickyKeys feature available */
+            lpStickyKeys->dwFlags = 0;
+        }
+        else
+        {
+            ret = FALSE;
+        }
+        break;
+    }
     WINE_SPI_FIXME(SPI_SETSTICKYKEYS);		/*     59 */
-    WINE_SPI_FIXME(SPI_GETACCESSTIMEOUT);	/*     60 */
+
+    case SPI_GETACCESSTIMEOUT:                  /*     60 */
+    {
+        LPACCESSTIMEOUT lpAccessTimeout = (LPACCESSTIMEOUT)pvParam;
+        WARN("SPI_GETACCESSTIMEOUT not fully implemented\n");
+        if (lpAccessTimeout->cbSize == sizeof(ACCESSTIMEOUT))
+        {
+            /* Indicate that no accessibility features timeout is available */
+            lpAccessTimeout->dwFlags = 0;
+            lpAccessTimeout->iTimeOutMSec = 0;
+        }
+        else
+        {
+            ret = FALSE;
+        }
+        break;
+    }
     WINE_SPI_FIXME(SPI_SETACCESSTIMEOUT);	/*     61 */
 
-    WINE_SPI_FIXME(SPI_GETSERIALKEYS);		/*     62  WINVER >= 0x400 */
+    case SPI_GETSERIALKEYS:                     /*     62  WINVER >= 0x400 */
+    {
+        LPSERIALKEYSA lpSerialKeysA = (LPSERIALKEYSA)pvParam;
+        WARN("SPI_GETSERIALKEYS not fully implemented\n");
+        if (lpSerialKeysA->cbSize == sizeof(SERIALKEYSA))
+        {
+            /* Indicate that no SerialKeys feature available */
+            lpSerialKeysA->dwFlags = 0;
+            lpSerialKeysA->lpszActivePort = NULL;
+            lpSerialKeysA->lpszPort = NULL;
+            lpSerialKeysA->iBaudRate = 0;
+            lpSerialKeysA->iPortState = 0;
+        }
+        else
+        {
+            ret = FALSE;
+        }
+        break;
+    }
     WINE_SPI_FIXME(SPI_SETSERIALKEYS);		/*     63  WINVER >= 0x400 */
 
-    WINE_SPI_FIXME(SPI_GETSOUNDSENTRY);		/*     64 */
+    case SPI_GETSOUNDSENTRY:                    /*     64 */
+    {
+        LPSOUNDSENTRYA lpSoundSentryA = (LPSOUNDSENTRYA)pvParam;
+        WARN("SPI_GETSOUNDSENTRY not fully implemented\n");
+        if (lpSoundSentryA->cbSize == sizeof(SOUNDSENTRYA))
+        {
+            /* Indicate that no SoundSentry feature available */
+            lpSoundSentryA->dwFlags = 0;
+            lpSoundSentryA->iFSTextEffect = 0;
+            lpSoundSentryA->iFSTextEffectMSec = 0;
+            lpSoundSentryA->iFSTextEffectColorBits = 0;
+            lpSoundSentryA->iFSGrafEffect = 0;
+            lpSoundSentryA->iFSGrafEffectMSec = 0;
+            lpSoundSentryA->iFSGrafEffectColor = 0;
+            lpSoundSentryA->iWindowsEffect = 0;
+            lpSoundSentryA->iWindowsEffectMSec = 0;
+            lpSoundSentryA->lpszWindowsEffectDLL = 0;
+            lpSoundSentryA->iWindowsEffectOrdinal = 0;
+        }
+        else
+        {
+            ret = FALSE;
+        }
+        break;
+    }
     WINE_SPI_FIXME(SPI_SETSOUNDSENTRY);		/*     65 */
     
     case SPI_GETHIGHCONTRAST:			/*     66  WINVER >= 0x400 */
@@ -1314,7 +1441,7 @@
 	WARN("SPI_GETHIGHCONTRAST not fully implemented\n");
 	if (lpHighContrastA->cbSize == sizeof(HIGHCONTRASTA))
 	{
-	    /* Indicate that there is no high contrast available */
+	    /* Indicate that no high contrast feature available */
 	    lpHighContrastA->dwFlags = 0;
 	    lpHighContrastA->lpszDefaultScheme = NULL;
 	}