ReactOS 0.4.15-dev-8235-gcd88a97
precomp.h File Reference
#include <stdio.h>
#include <windows.h>
#include <debug.h>
#include "commctrl.h"
#include "strsafe.h"
#include "osk_res.h"
Include dependency graph for precomp.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _KEY
 
struct  _KEYBOARD_STRUCT
 
struct  OSK_GLOBALS
 
struct  OSK_KEYLEDINDICATOR
 

Macros

#define SCANCODE_MASK   0xFF
 
#define OSK_CLASS   L"OSKMainWindow"
 
#define DEFAULT_FONTSIZE   15
 

Typedefs

typedef struct _KEY KEY
 
typedef struct _KEYPKEY
 
typedef struct _KEYBOARD_STRUCT KEYBOARD_STRUCT
 
typedef struct _KEYBOARD_STRUCTPKEYBOARD_STRUCT
 

Enumerations

enum  SetKeys_Reason { SETKEYS_INIT , SETKEYS_LAYOUT , SETKEYS_LANG }
 

Functions

int OSK_SetImage (int IdDlgItem, int IdResource)
 
LRESULT OSK_Create (HWND hwnd)
 
int OSK_Close (void)
 
int OSK_Timer (void)
 
BOOL OSK_Command (WPARAM wCommand, HWND hWndControl)
 
BOOL OSK_ReleaseKey (WORD ScanCode)
 
LRESULT APIENTRY OSK_WndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
DWORD WINAPI OSK_WarningDlgThread (LPVOID lpParameter)
 
int WINAPI wWinMain (HINSTANCE, HINSTANCE, LPWSTR, int)
 
VOID OSK_RestoreDlgPlacement (HWND hDlg)
 
VOID OSK_RefreshLEDKeys (VOID)
 
INT_PTR CALLBACK OSK_WarningProc (HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
 
LONG LoadDWORDFromRegistry (IN LPCWSTR lpValueDataName, OUT PDWORD pdwValueData)
 
LONG LoadStringFromRegistry (IN LPCWSTR lpValueDataName, OUT LPWSTR lpValueData, IN OUT LPUINT cchCount)
 
LONG SaveDWORDToRegistry (IN LPCWSTR lpValueDataName, IN DWORD dwValueData)
 
LONG SaveStringToRegistry (IN LPCWSTR lpValueDataName, IN LPCWSTR lpValueData, IN UINT cchCount)
 
VOID LoadSettings (VOID)
 
VOID SaveSettings (VOID)
 

Variables

KEYBOARD_STRUCT StandardKeyboard
 
KEYBOARD_STRUCT EnhancedKeyboard
 
OSK_GLOBALS Globals
 

Macro Definition Documentation

◆ DEFAULT_FONTSIZE

#define DEFAULT_FONTSIZE   15

Definition at line 125 of file precomp.h.

◆ OSK_CLASS

#define OSK_CLASS   L"OSKMainWindow"

Definition at line 124 of file precomp.h.

◆ SCANCODE_MASK

#define SCANCODE_MASK   0xFF

Definition at line 120 of file precomp.h.

Typedef Documentation

◆ KEY

typedef struct _KEY KEY

◆ KEYBOARD_STRUCT

◆ PKEY

typedef struct _KEY * PKEY

◆ PKEYBOARD_STRUCT

Enumeration Type Documentation

◆ SetKeys_Reason

Enumerator
SETKEYS_INIT 
SETKEYS_LAYOUT 
SETKEYS_LANG 

Definition at line 128 of file precomp.h.

129{
133};
@ SETKEYS_LANG
Definition: precomp.h:132
@ SETKEYS_LAYOUT
Definition: precomp.h:131
@ SETKEYS_INIT
Definition: precomp.h:130

Function Documentation

◆ LoadDWORDFromRegistry()

LONG LoadDWORDFromRegistry ( IN LPCWSTR  lpValueDataName,
OUT PDWORD  pdwValueData 
)

Definition at line 15 of file settings.c.

17{
18 HKEY hKey;
19 LONG lResult;
20 DWORD dwValue;
21 DWORD cbData = sizeof(dwValue);
22
23 /* Initialize the pointer parameter to default */
24 *pdwValueData = 0;
25
26 /* Open our application's key in order to load its configuration data */
28 L"Software\\Microsoft\\Osk",
29 0,
31 &hKey);
32
33 if (lResult != ERROR_SUCCESS)
34 {
35 /* Bail out */
36 DPRINT("LoadDWORDFromRegistry(): Failed to open the application's key! (Error - %li)\n", lResult);
37 return lResult;
38 }
39
40 /* Load the specific value based on the parameter caller, lpValueDataName */
41 lResult = RegQueryValueExW(hKey,
42 lpValueDataName,
43 0,
44 0,
45 (BYTE *)&dwValue,
46 &cbData);
47
48 if (lResult != ERROR_SUCCESS)
49 {
50
51 /* Bail out */
52 DPRINT("LoadDWORDFromRegistry(): Failed to load the following value - \"%S\". (Error - %li)\n", lpValueDataName, lResult);
54 return lResult;
55 }
56
57 /* Is the buffer's size too small to query the required data? */
58 if (cbData != sizeof(dwValue))
59 {
60 /* It is therefore bail out */
61 DPRINT("LoadDWORDFromRegistry(): The buffer is too small to hold the data!\n");
63 return ERROR_MORE_DATA;
64 }
65
66 *pdwValueData = dwValue;
68 return lResult;
69}
#define RegCloseKey(hKey)
Definition: registry.h:49
#define ERROR_MORE_DATA
Definition: dderror.h:13
#define ERROR_SUCCESS
Definition: deptool.c:10
LONG WINAPI RegOpenKeyExW(HKEY hKey, LPCWSTR lpSubKey, DWORD ulOptions, REGSAM samDesired, PHKEY phkResult)
Definition: reg.c:3333
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4103
unsigned long DWORD
Definition: ntddk_ex.h:95
FxAutoRegKey hKey
#define KEY_READ
Definition: nt_native.h:1023
#define L(x)
Definition: ntvdm.h:50
long LONG
Definition: pedump.c:60
#define DPRINT
Definition: sndvol32.h:73
#define HKEY_CURRENT_USER
Definition: winreg.h:11
unsigned char BYTE
Definition: xxhash.c:193

Referenced by LoadSettings().

◆ LoadSettings()

VOID LoadSettings ( VOID  Dlg)

Definition at line 53 of file settings.c.

54{
55 HKEY hKey = NULL;
56 int iItemIndex = -1;
57
59 {
60 TCHAR szBuffer[MAX_PATH];
61 DWORD dwAdvancedChecked;
62 DWORD type, size = sizeof(dwAdvancedChecked);
63 LSTATUS lstatus;
64
65 /* Restore last selected font */
66 if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("Font"), szBuffer, (sizeof(szBuffer)/sizeof(szBuffer[0]))) == ERROR_SUCCESS)
67 {
68 //Get combobox handle
70
71 //Search for match and return index if match found
72 iItemIndex = ComboBox_FindStringExact(hWnd, -1, szBuffer);
73 if(iItemIndex != CB_ERR)
74 {
75 ComboBox_SetCurSel(hWnd, iItemIndex);
77 }
78 }
79
80 /* Restore last selected character set */
81 if (QueryStringValue(HKEY_CURRENT_USER, g_szGeneralRegKey, _T("CodePage"), szBuffer, (sizeof(szBuffer)/sizeof(szBuffer[0]))) == ERROR_SUCCESS)
82 {
83 //Get combobox handle
85
86 iItemIndex = ComboBox_FindStringExact(hWnd, -1, szBuffer);
87 if(iItemIndex != CB_ERR)
88 {
89 ComboBox_SetCurSel(hWnd, iItemIndex);
90 }
91 }
92
93 lstatus = RegQueryValueEx(hKey, _T("Advanced"), NULL, &type, (LPBYTE)&dwAdvancedChecked, &size);
94 if (lstatus == ERROR_SUCCESS && type == REG_DWORD && dwAdvancedChecked != FALSE)
95 {
97 }
98
100 }
101 else
102 {
103 /* Default font seems to be Arial */
105
106 iItemIndex = ComboBox_FindStringExact(hWnd, -1, _T("Arial"));
107 if(iItemIndex != CB_ERR)
108 {
109 ComboBox_SetCurSel(hWnd, iItemIndex);
111 }
112 }
113}
#define IDC_FONTCOMBO
Definition: resource.h:12
#define IDC_CHECK_ADVANCED
Definition: resource.h:26
#define IDC_COMBO_CHARSET
Definition: resource.h:21
LONG QueryStringValue(HKEY hKey, LPCTSTR lpSubKey, LPCTSTR lpValueName, LPTSTR pszBuffer, DWORD dwBufferLen)
Definition: settings.c:19
const TCHAR g_szGeneralRegKey[]
Definition: settings.c:16
HWND hWnd
Definition: settings.c:17
HWND hCharmapDlg
Definition: charmap.c:21
VOID ChangeMapFont(HWND hDlg)
Definition: charmap.c:161
static LSTATUS(WINAPI *pRegDeleteTreeW)(HKEY
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define MAX_PATH
Definition: compat.h:34
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLsizeiptr size
Definition: glext.h:5919
#define REG_DWORD
Definition: sdbapi.c:596
unsigned char * LPBYTE
Definition: typedefs.h:53
#define _T(x)
Definition: vfdio.h:22
#define ComboBox_SetCurSel(hwndCtl, index)
Definition: windowsx.h:66
#define ComboBox_FindStringExact(hwndCtl, indexStart, lpszFind)
Definition: windowsx.h:47
#define RegOpenKeyEx
Definition: winreg.h:520
#define RegQueryValueEx
Definition: winreg.h:524
#define CB_ERR
Definition: winuser.h:2435
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define BM_CLICK
Definition: winuser.h:1917
#define SendDlgItemMessage
Definition: winuser.h:5851
char TCHAR
Definition: xmlstorage.h:189

◆ LoadStringFromRegistry()

LONG LoadStringFromRegistry ( IN LPCWSTR  lpValueDataName,
OUT LPWSTR  lpValueData,
IN OUT LPUINT  cchCount 
)

Definition at line 73 of file settings.c.

76{
77 HKEY hKey;
78 LONG lResult;
80
81 cbCount = (*cchCount) * sizeof(WCHAR);
82
83 /* Open our application's key in order to load its configuration data */
85 L"Software\\Microsoft\\Osk",
86 0,
88 &hKey);
89
90 if (lResult != ERROR_SUCCESS)
91 {
92 /* Bail out */
93 DPRINT("LoadStringFromRegistry(): Failed to open the application's key! (Error - %li)\n", lResult);
94 return lResult;
95 }
96
97 /* Load the specific value based on the parameter caller, lpValueDataName */
98 lResult = RegQueryValueExW(hKey,
99 lpValueDataName,
100 0,
101 0,
102 (BYTE *)lpValueData,
103 (LPDWORD)&cbCount);
104
105
106 if (lResult != ERROR_SUCCESS)
107 {
108
109 /* Bail out */
110 DPRINT("LoadStringFromRegistry(): Failed to load the following value - \"%S\". (Error - %li)\n", lpValueDataName, lResult);
112 return lResult;
113 }
114
115 *cchCount = cbCount / sizeof(WCHAR);
116
118 return lResult;
119}
static int cbCount
Definition: fiber.c:42
unsigned int UINT
Definition: ndis.h:50
uint32_t * LPDWORD
Definition: typedefs.h:59
__wchar_t WCHAR
Definition: xmlstorage.h:180

Referenced by LoadSettings().

◆ OSK_Close()

int OSK_Close ( void  )

Definition at line 485 of file main.c.

486{
488
489 /* Release Ctrl, Shift, Alt keys */
490 OSK_ReleaseKey(SCAN_CODE_44); // Left shift
491 OSK_ReleaseKey(SCAN_CODE_57); // Right shift
492 OSK_ReleaseKey(SCAN_CODE_58); // Left ctrl
493 OSK_ReleaseKey(SCAN_CODE_60); // Left alt
494 OSK_ReleaseKey(SCAN_CODE_62); // Right alt
495 OSK_ReleaseKey(SCAN_CODE_64); // Right ctrl
496
497 /* Destroy child controls */
499
500 /* delete GDI objects */
503
504 /* Save the application's settings on registry */
505 SaveSettings();
506
507 return TRUE;
508}
void SaveSettings(void)
Definition: settings.c:115
VOID OSK_DestroyKeys(VOID)
Definition: main.c:157
BOOL OSK_ReleaseKey(WORD ScanCode)
Definition: main.c:710
OSK_GLOBALS Globals
Definition: main.c:16
#define TRUE
Definition: types.h:120
pKey DeleteObject()
#define SCAN_CODE_64
Definition: osk_res.h:134
#define SCAN_CODE_44
Definition: osk_res.h:117
#define SCAN_CODE_60
Definition: osk_res.h:131
#define SCAN_CODE_58
Definition: osk_res.h:130
#define SCAN_CODE_57
Definition: osk_res.h:129
#define SCAN_CODE_62
Definition: osk_res.h:133
HWND hMainWnd
Definition: precomp.h:53
UINT_PTR iTimer
Definition: precomp.h:55
HBRUSH hBrushGreenLed
Definition: precomp.h:54
HFONT hFont
Definition: precomp.h:58
BOOL WINAPI KillTimer(_In_opt_ HWND, _In_ UINT_PTR)

Referenced by OSK_WndProc().

◆ OSK_Command()

BOOL OSK_Command ( WPARAM  wCommand,
HWND  hWndControl 
)

Definition at line 614 of file main.c.

615{
617 INPUT Input;
618 BOOL bExtendedKey;
619 BOOL bKeyDown;
620 BOOL bKeyUp;
621 LONG WindowStyle;
622 INT i;
623
624 /* KeyDown and/or KeyUp ? */
625 WindowStyle = GetWindowLongW(hWndControl, GWL_STYLE);
626 if ((WindowStyle & BS_AUTOCHECKBOX) == BS_AUTOCHECKBOX)
627 {
628 /* 2-states key like Shift, Alt, Ctrl, ... */
629 if (SendMessageW(hWndControl, BM_GETCHECK, 0, 0) == BST_CHECKED)
630 {
631 bKeyDown = TRUE;
632 bKeyUp = FALSE;
633 }
634 else
635 {
636 bKeyDown = FALSE;
637 bKeyUp = TRUE;
638 }
639 }
640 else
641 {
642 /* Other key */
643 bKeyDown = TRUE;
644 bKeyUp = TRUE;
645 }
646
647 /* Get the key from dialog control key command */
648 ScanCode = wCommand;
649
650 /*
651 The user could've pushed one of the key buttons of the dialog that
652 can trigger particular function toggling (Caps Lock, Num Lock or Scroll Lock). Update
653 (invalidate) the LED icon resources accordingly.
654 */
655 for (i = 0; i < _countof(LedKey); i++)
656 {
657 if (LedKey[i].wScanCode == ScanCode)
658 {
660 }
661 }
662
663 /* Extended key ? */
664 if (ScanCode & 0x0200)
665 bExtendedKey = TRUE;
666 else
667 bExtendedKey = FALSE;
669
670 /* Press and release the key */
671 if (bKeyDown)
672 {
673 Input.type = INPUT_KEYBOARD;
674 Input.ki.wVk = 0;
675 Input.ki.wScan = ScanCode;
676 Input.ki.time = GetTickCount();
677 Input.ki.dwExtraInfo = GetMessageExtraInfo();
678 Input.ki.dwFlags = KEYEVENTF_SCANCODE;
679 if (bExtendedKey) Input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
680 SendInput(1, &Input, sizeof(Input));
681 }
682
683 if (bKeyUp)
684 {
685 Input.type = INPUT_KEYBOARD;
686 Input.ki.wVk = 0;
687 Input.ki.wScan = ScanCode;
688 Input.ki.time = GetTickCount();
689 Input.ki.dwExtraInfo = GetMessageExtraInfo();
690 Input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
691 if (bExtendedKey) Input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
692 SendInput(1, &Input, sizeof(Input));
693 }
694
695 /* Play the sound during clicking event (only if "Use Click Sound" menu option is ticked) */
697 {
699 }
700
701 return TRUE;
702}
UINT ScanCode
Definition: VirtualKey.c:24
OSK_KEYLEDINDICATOR LedKey[]
Definition: main.c:18
#define SCANCODE_MASK
Definition: precomp.h:120
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:455
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned short WORD
Definition: ntddk_ex.h:93
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define SND_RESOURCE
Definition: mmsystem.h:163
#define SND_ASYNC
Definition: mmsystem.h:154
#define IDI_SOUNDCLICK
Definition: osk_res.h:8
#define BS_AUTOCHECKBOX
Definition: pedump.c:654
BOOL WINAPI PlaySoundW(LPCWSTR pszSoundW, HMODULE hmod, DWORD fdwSound)
Definition: playsound.c:653
@ Input
Definition: arc.h:84
#define _countof(array)
Definition: sndvol32.h:70
BOOL bSoundClick
Definition: precomp.h:64
int32_t INT
Definition: typedefs.h:58
UINT WINAPI SendInput(UINT, LPINPUT, int)
Definition: ntwrapper.h:344
#define INPUT_KEYBOARD
Definition: winable.h:10
#define GetModuleHandle
Definition: winbase.h:3827
LONG WINAPI GetWindowLongW(_In_ HWND, _In_ int)
#define KEYEVENTF_EXTENDEDKEY
Definition: winuser.h:1101
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define GWL_STYLE
Definition: winuser.h:852
LPARAM WINAPI GetMessageExtraInfo(void)
Definition: message.c:1340
#define KEYEVENTF_KEYUP
Definition: winuser.h:1102
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BST_CHECKED
Definition: winuser.h:197
#define BM_GETCHECK
Definition: winuser.h:1918

Referenced by OSK_WndProc().

◆ OSK_Create()

LRESULT OSK_Create ( HWND  hwnd)

Definition at line 367 of file main.c.

368{
369 HMONITOR monitor;
371 POINT Pt;
372 RECT rcWindow, rcDlgIntersect;
373 LOGFONTW lf = {0};
374
375 /* Save handle */
377
378 /* Init Font */
382
383 if (OSK_SetKeys(SETKEYS_INIT) == -1)
384 return -1;
385
386 /* Check the checked menu item before displaying the window */
388 {
389 /* Enhanced keyboard dialog chosen, set the respective menu item as checked */
392 }
393 else
394 {
395 /* Standard keyboard dialog chosen, set the respective menu item as checked */
398 }
399
400 /* Check if the "Click Sound" option was chosen before (and if so, then tick the menu item) */
402 {
404 }
405
406 /* Get screen info */
407 memset(&Pt, 0, sizeof(Pt));
408 monitor = MonitorFromPoint(Pt, MONITOR_DEFAULTTOPRIMARY);
409 info.cbSize = sizeof(info);
410 GetMonitorInfoW(monitor, &info);
411 GetWindowRect(hwnd, &rcWindow);
412
413 /*
414 If the coordination values are default then re-initialize using the specific formulas
415 to move the dialog at the bottom of the screen.
416 */
418 {
419 Globals.PosX = (info.rcMonitor.left + info.rcMonitor.right - (rcWindow.right - rcWindow.left)) / 2;
420 Globals.PosY = info.rcMonitor.bottom - (rcWindow.bottom - rcWindow.top);
421 }
422
423 /*
424 Calculate the intersection of two rectangle sources (dialog and work desktop area).
425 If such sources do not intersect, then the dialog is deemed as "off screen".
426 */
427 if (IntersectRect(&rcDlgIntersect, &rcWindow, &info.rcWork) == 0)
428 {
429 Globals.PosX = (info.rcMonitor.left + info.rcMonitor.right - (rcWindow.right - rcWindow.left)) / 2;
430 Globals.PosY = info.rcMonitor.bottom - (rcWindow.bottom - rcWindow.top);
431 }
432 else
433 {
434 /*
435 There's still some intersection but we're not for sure if it is sufficient (the dialog could also be partially hidden).
436 Therefore, check the remaining intersection if it's enough.
437 */
438 if (rcWindow.top < info.rcWork.top || rcWindow.left < info.rcWork.left || rcWindow.right > info.rcWork.right || rcWindow.bottom > info.rcWork.bottom)
439 {
440 Globals.PosX = (info.rcMonitor.left + info.rcMonitor.right - (rcWindow.right - rcWindow.left)) / 2;
441 Globals.PosY = info.rcMonitor.bottom - (rcWindow.bottom - rcWindow.top);
442 }
443 }
444
445 /*
446 Place the window (with respective placement coordinates) as topmost, above
447 every window which are not on top or are at the bottom of the Z order.
448 */
450 {
453 }
454 else
455 {
458 }
459
460 /* Create a green brush for leds */
462
463 /* Set a timer for periodic tasks */
464 Globals.iTimer = SetTimer(hwnd, 0, 100, NULL);
465
466 /* If the member of the struct (bShowWarning) is set then display the dialog box */
468 {
469 /* If for whatever reason the thread fails to be created then handle the dialog box in main thread... */
471 {
473 }
474 }
475
476 return 0;
477}
DWORD WINAPI OSK_WarningDlgThread(LPVOID lpParameter)
Definition: main.c:124
LRESULT OSK_SetKeys(int reason)
Definition: main.c:183
INT_PTR CALLBACK OSK_WarningProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: main.c:83
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
#define RGB(r, g, b)
Definition: precomp.h:71
HMONITOR WINAPI MonitorFromPoint(POINT, DWORD)
#define IDM_STANDARD_KB
Definition: osk_res.h:33
#define IDM_CLICK_SOUND
Definition: osk_res.h:41
#define IDM_ENHANCED_KB
Definition: osk_res.h:34
#define IDM_ON_TOP
Definition: osk_res.h:40
#define IDD_WARNINGDIALOG_OSK
Definition: osk_res.h:47
#define memset(x, y, z)
Definition: compat.h:39
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
LONG lfHeight
Definition: dimm.idl:59
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
WCHAR FontFaceName[LF_FACESIZE]
Definition: precomp.h:68
BOOL bAlwaysOnTop
Definition: precomp.h:65
HINSTANCE hInstance
Definition: precomp.h:52
LONG FontHeight
Definition: precomp.h:69
INT PosX
Definition: precomp.h:66
INT PosY
Definition: precomp.h:67
BOOL bShowWarning
Definition: precomp.h:62
BOOL bIsEnhancedKeyboard
Definition: precomp.h:63
LONG right
Definition: windef.h:308
LONG bottom
Definition: windef.h:309
LONG top
Definition: windef.h:307
LONG left
Definition: windef.h:306
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
HBRUSH WINAPI CreateSolidBrush(_In_ COLORREF)
#define MF_BYCOMMAND
Definition: winuser.h:202
#define HWND_TOPMOST
Definition: winuser.h:1208
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
BOOL WINAPI SetWindowPos(_In_ HWND, _In_opt_ HWND, _In_ int, _In_ int, _In_ int, _In_ int, _In_ UINT)
#define DialogBoxW(i, t, p, f)
Definition: winuser.h:4399
#define MF_CHECKED
Definition: winuser.h:132
#define SWP_NOSIZE
Definition: winuser.h:1245
#define MF_UNCHECKED
Definition: winuser.h:204
UINT_PTR WINAPI SetTimer(_In_opt_ HWND, _In_ UINT_PTR, _In_ UINT, _In_opt_ TIMERPROC)
DWORD WINAPI CheckMenuItem(_In_ HMENU, _In_ UINT, _In_ UINT)
BOOL WINAPI IntersectRect(_Out_ LPRECT, _In_ LPCRECT, _In_ LPCRECT)
#define CW_USEDEFAULT
Definition: winuser.h:225
BOOL WINAPI GetMonitorInfoW(_In_ HMONITOR, _Inout_ LPMONITORINFO)
#define HWND_NOTOPMOST
Definition: winuser.h:1206
HMENU WINAPI GetMenu(_In_ HWND)

Referenced by OSK_WndProc().

◆ OSK_RefreshLEDKeys()

VOID OSK_RefreshLEDKeys ( VOID  )

Definition at line 517 of file main.c.

518{
519 INT i;
520 BOOL bKeyIsPressed;
521
522 for (i = 0; i < _countof(LedKey); i++)
523 {
524 bKeyIsPressed = (GetAsyncKeyState(LedKey[i].vKey) & 0x8000) != 0;
525 if (LedKey[i].bWasKeyPressed != bKeyIsPressed)
526 {
527 LedKey[i].bWasKeyPressed = bKeyIsPressed;
529 }
530 }
531}
SHORT WINAPI GetAsyncKeyState(_In_ int)

Referenced by OSK_Timer().

◆ OSK_ReleaseKey()

BOOL OSK_ReleaseKey ( WORD  ScanCode)

Definition at line 710 of file main.c.

711{
712 INPUT Input;
713 BOOL bExtendedKey;
714 LONG WindowStyle;
715 HWND hWndControl;
716
717 /* Is it a 2-states key ? */
718 hWndControl = GetDlgItem(Globals.hMainWnd, ScanCode);
719 WindowStyle = GetWindowLongW(hWndControl, GWL_STYLE);
720 if ((WindowStyle & BS_AUTOCHECKBOX) != BS_AUTOCHECKBOX) return FALSE;
721
722 /* Is the key down ? */
723 if (SendMessageW(hWndControl, BM_GETCHECK, 0, 0) != BST_CHECKED) return TRUE;
724
725 /* Extended key ? */
726 if (ScanCode & 0x0200)
727 bExtendedKey = TRUE;
728 else
729 bExtendedKey = FALSE;
731
732 /* Release the key */
733 Input.type = INPUT_KEYBOARD;
734 Input.ki.wVk = 0;
735 Input.ki.wScan = ScanCode;
736 Input.ki.time = GetTickCount();
737 Input.ki.dwExtraInfo = GetMessageExtraInfo();
738 Input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
739 if (bExtendedKey) Input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
740 SendInput(1, &Input, sizeof(Input));
741
742 return TRUE;
743}

Referenced by OSK_Close().

◆ OSK_RestoreDlgPlacement()

VOID OSK_RestoreDlgPlacement ( HWND  hDlg)

◆ OSK_SetImage()

int OSK_SetImage ( int  IdDlgItem,
int  IdResource 
)

Definition at line 33 of file main.c.

34{
36 HWND hWndItem;
37
40 if (hIcon == NULL)
41 return FALSE;
42
43 hWndItem = GetDlgItem(Globals.hMainWnd, IdDlgItem);
44 if (hWndItem == NULL)
45 {
47 return FALSE;
48 }
49
51
52 /* The system automatically deletes these resources when the process that created them terminates (MSDN) */
53
54 return TRUE;
55}
static HICON
Definition: imagelist.c:84
HICON hIcon
Definition: msconfig.c:44
LONG_PTR LPARAM
Definition: windef.h:208
UINT_PTR WPARAM
Definition: windef.h:207
#define IMAGE_ICON
Definition: winuser.h:212
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE hInst, _In_ LPCWSTR name, _In_ UINT type, _In_ int cx, _In_ int cy, _In_ UINT fuLoad)
Definition: cursoricon.c:2234
#define BM_SETIMAGE
Definition: winuser.h:1922
#define LR_DEFAULTCOLOR
Definition: winuser.h:1087
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2084

Referenced by OSK_SetKeys().

◆ OSK_Timer()

int OSK_Timer ( void  )

Definition at line 539 of file main.c.

540{
541 HWND hWndActiveWindow;
542 DWORD dwThread;
543 HKL hKeyboardLayout;
544
545 hWndActiveWindow = GetForegroundWindow();
546 if (hWndActiveWindow != NULL && hWndActiveWindow != Globals.hMainWnd)
547 {
548 /* Grab the current keyboard layout from the foreground window */
549 dwThread = GetWindowThreadProcessId(hWndActiveWindow, NULL);
550 hKeyboardLayout = GetKeyboardLayout(dwThread);
551 /* Activate the layout */
552 ActivateKeyboardLayout(hKeyboardLayout, 0);
553 }
554
555 /*
556 Update the LED key indicators accordingly to their state (if one
557 of the specific keys is held down).
558 */
560 /* Update the buttons */
562
563 return TRUE;
564}
VOID OSK_RefreshLEDKeys(VOID)
Definition: main.c:517
UINT_PTR HKL
Definition: msctf.idl:143
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
HKL WINAPI GetKeyboardLayout(_In_ DWORD)
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
HKL WINAPI ActivateKeyboardLayout(_In_ HKL, _In_ UINT)

Referenced by OSK_WndProc().

◆ OSK_WarningDlgThread()

DWORD WINAPI OSK_WarningDlgThread ( LPVOID  lpParameter)

Definition at line 124 of file main.c.

125{
126 HINSTANCE hInstance = (HINSTANCE)lpParameter;
127
129 return 0;
130}
HINSTANCE hInstance
Definition: charmap.c:19
HANDLE HINSTANCE
Definition: typedefs.h:77

Referenced by OSK_Create().

◆ OSK_WarningProc()

INT_PTR CALLBACK OSK_WarningProc ( HWND  hDlg,
UINT  Msg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 83 of file main.c.

84{
86
87 switch (Msg)
88 {
89 case WM_INITDIALOG:
90 {
91 return TRUE;
92 }
93
94 case WM_COMMAND:
95 {
96 switch (LOWORD(wParam))
97 {
99 {
101 return TRUE;
102 }
103
104 case IDOK:
105 case IDCANCEL:
106 {
107 EndDialog(hDlg, LOWORD(wParam));
108 return TRUE;
109 }
110 }
111 break;
112 }
113 }
114
115 return FALSE;
116}
#define IDC_SHOWWARNINGCHECK
Definition: resource.h:25
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
struct @1643 Msg[]
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define LOWORD(l)
Definition: pedump.c:82
#define IDCANCEL
Definition: winuser.h:831
#define WM_COMMAND
Definition: winuser.h:1740
#define WM_INITDIALOG
Definition: winuser.h:1739
#define IDOK
Definition: winuser.h:830
UINT WINAPI IsDlgButtonChecked(_In_ HWND, _In_ int)
BOOL WINAPI EndDialog(_In_ HWND, _In_ INT_PTR)

Referenced by OSK_Create(), and OSK_WarningDlgThread().

◆ OSK_WndProc()

LRESULT APIENTRY OSK_WndProc ( HWND  hwnd,
UINT  msg,
WPARAM  wParam,
LPARAM  lParam 
)

Definition at line 792 of file main.c.

793{
794 switch (msg)
795 {
796 case WM_CREATE:
797 return OSK_Create(hwnd);
798
799 case WM_PAINT:
800 return OSK_Paint(hwnd);
801
802 case WM_TIMER:
803 return OSK_Timer();
804
807 {
808 if (GetKeyState(VK_NUMLOCK) & 0x0001)
810 else
812 }
814 {
815 if (GetKeyState(VK_CAPITAL) & 0x0001)
817 else
819 }
821 {
822 if (GetKeyState(VK_SCROLL) & 0x0001)
824 else
826 }
827 break;
828
829 case WM_COMMAND:
830 switch (LOWORD(wParam))
831 {
832 case IDM_EXIT:
833 {
834 PostMessageW(hwnd, WM_CLOSE, 0, 0);
835 break;
836 }
837
838 case IDM_ENHANCED_KB:
839 {
841 {
842 /*
843 The user attempted to switch to enhanced keyboard dialog type.
844 Set the member value as TRUE, destroy the dialog and save the data configuration into the registry.
845 */
847 SaveSettings();
848
849 /* Change the condition of enhanced keyboard item menu to checked */
852
853 /* Finally, update the key layout */
854 LoadSettings();
856 }
857
858 break;
859 }
860
861 case IDM_STANDARD_KB:
862 {
864 {
865 /*
866 The user attempted to switch to standard keyboard dialog type.
867 Set the member value as FALSE, destroy the dialog and save the data configuration into the registry.
868 */
870 SaveSettings();
871
872 /* Change the condition of standard keyboard item menu to checked */
875
876 /* Finally, update the key layout */
877 LoadSettings();
879 }
880
881 break;
882 }
883
884 case IDM_CLICK_SOUND:
885 {
886 /*
887 This case is triggered when the user attempts to click on the menu item. Before doing anything,
888 we must check the condition state of such menu item so that we can tick/untick the menu item accordingly.
889 */
890 if (!Globals.bSoundClick)
891 {
894 }
895 else
896 {
899 }
900
901 break;
902 }
903
904 case IDM_ON_TOP:
905 {
906 /*
907 Check the condition state before disabling/enabling the menu
908 item and change the topmost order.
909 */
911 {
915 }
916 else
917 {
921 }
922
923 break;
924 }
925
926 case IDM_FONT:
927 {
929 break;
930 }
931
932 case IDM_ABOUT:
933 {
934 OSK_About();
935 break;
936 }
937
938 default:
940 break;
941 }
942 return 0;
943
944 case WM_THEMECHANGED:
945 /* Redraw the dialog (and its control buttons) using the new theme */
947 return 0;
948
949 case WM_CLOSE:
950 OSK_Close();
952 return 0;
953 }
955}
#define msg(x)
Definition: auth_time.c:54
void LoadSettings(void)
Definition: settings.c:53
#define IDM_ABOUT
Definition: resource.h:29
#define IDM_EXIT
Definition: resource.h:27
VOID OSK_ChooseFont(VOID)
Definition: main.c:572
LRESULT OSK_Create(HWND hwnd)
Definition: main.c:367
BOOL OSK_Command(WPARAM wCommand, HWND hWndControl)
Definition: main.c:614
LRESULT OSK_Paint(HWND hwnd)
Definition: main.c:751
VOID OSK_About(VOID)
Definition: main.c:138
int OSK_Timer(void)
Definition: main.c:539
int OSK_Close(void)
Definition: main.c:485
#define IDC_LED_CAPS
Definition: osk_res.h:11
#define IDC_LED_SCROLL
Definition: osk_res.h:12
#define IDM_FONT
Definition: osk_res.h:43
#define IDC_LED_NUM
Definition: osk_res.h:10
LONG_PTR LRESULT
Definition: windef.h:209
HGDIOBJ WINAPI GetStockObject(_In_ int)
#define BLACK_BRUSH
Definition: wingdi.h:896
#define WM_PAINT
Definition: winuser.h:1620
#define WM_CTLCOLORSTATIC
Definition: winuser.h:1772
#define WM_CLOSE
Definition: winuser.h:1621
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define WM_CREATE
Definition: winuser.h:1608
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define VK_CAPITAL
Definition: winuser.h:2206
#define SWP_NOMOVE
Definition: winuser.h:1244
#define VK_SCROLL
Definition: winuser.h:2280
#define WM_TIMER
Definition: winuser.h:1742
#define VK_NUMLOCK
Definition: winuser.h:2279
SHORT WINAPI GetKeyState(_In_ int)

Referenced by wWinMain().

◆ SaveDWORDToRegistry()

LONG SaveDWORDToRegistry ( IN LPCWSTR  lpValueDataName,
IN DWORD  dwValueData 
)

Definition at line 121 of file settings.c.

123{
124 HKEY hKey;
125 LONG lResult;
126
127 /* Set up the application's key in case it has not been made yet */
129 L"Software\\Microsoft\\Osk",
130 0,
131 NULL,
132 0,
133 KEY_WRITE,
134 NULL,
135 &hKey,
136 NULL);
137
138 if (lResult != ERROR_SUCCESS)
139 {
140 /* Bail out */
141 DPRINT("SaveDWORDToRegistry(): Failed to create the application's key! (Error - %li)\n", lResult);
142 return lResult;
143 }
144
145 /* Save the data into the registry value */
146 lResult = RegSetValueExW(hKey,
147 lpValueDataName,
148 0,
149 REG_DWORD,
150 (BYTE *)&dwValueData,
151 sizeof(dwValueData));
152
153 if (lResult != ERROR_SUCCESS)
154 {
155 /* Bail out */
156 DPRINT("SaveDWORDToRegistry(): Failed to save the following value - \"%S\". (Error - %li)\n", lpValueDataName, lResult);
158 return lResult;
159 }
160
162 return lResult;
163}
LONG WINAPI RegCreateKeyExW(_In_ HKEY hKey, _In_ LPCWSTR lpSubKey, _In_ DWORD Reserved, _In_opt_ LPWSTR lpClass, _In_ DWORD dwOptions, _In_ REGSAM samDesired, _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes, _Out_ PHKEY phkResult, _Out_opt_ LPDWORD lpdwDisposition)
Definition: reg.c:1096
LONG WINAPI RegSetValueExW(_In_ HKEY hKey, _In_ LPCWSTR lpValueName, _In_ DWORD Reserved, _In_ DWORD dwType, _In_ CONST BYTE *lpData, _In_ DWORD cbData)
Definition: reg.c:4882
#define KEY_WRITE
Definition: nt_native.h:1031

Referenced by SaveSettings().

◆ SaveSettings()

VOID SaveSettings ( VOID  Dlg)

Definition at line 115 of file settings.c.

116{
117 HKEY hKey = NULL;
118
120 {
121 TCHAR szBuffer[MAX_PATH];
122
124 ComboBox_GetText(hWnd, szBuffer, MAX_PATH);
125
126 if(*szBuffer != '\0')
127 RegSetValueEx(hKey, _T("Font"), 0, REG_SZ, (LPBYTE) szBuffer, (DWORD) MAX_PATH);
128
130 ComboBox_GetText(hWnd, szBuffer, MAX_PATH);
131
132 if(*szBuffer != '\0')
133 RegSetValueEx(hKey, _T("CodePage"), 0, REG_SZ, (LPBYTE) szBuffer, (DWORD) MAX_PATH);
134
135 RegSetValueEx(hKey, _T("Advanced"), 0, REG_DWORD, (LPBYTE)&Settings.IsAdvancedView, (DWORD) sizeof(DWORD));
136
138 }
139}
#define REG_SZ
Definition: layer.c:22
#define REG_OPTION_NON_VOLATILE
Definition: nt_native.h:1057
#define KEY_SET_VALUE
Definition: nt_native.h:1017
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Settings
Definition: wdfdevice.h:2595
#define ComboBox_GetText(hwndCtl, lpch, cchMax)
Definition: windowsx.h:58
#define RegSetValueEx
Definition: winreg.h:533
#define RegCreateKeyEx
Definition: winreg.h:501

◆ SaveStringToRegistry()

LONG SaveStringToRegistry ( IN LPCWSTR  lpValueDataName,
IN LPCWSTR  lpValueData,
IN UINT  cchCount 
)

Definition at line 165 of file settings.c.

168{
169 HKEY hKey;
170 LONG lResult;
171
172 /* Set up the application's key in case it has not been made yet */
174 L"Software\\Microsoft\\Osk",
175 0,
176 NULL,
177 0,
178 KEY_WRITE,
179 NULL,
180 &hKey,
181 NULL);
182
183 if (lResult != ERROR_SUCCESS)
184 {
185 /* Bail out */
186 DPRINT("SaveStringToRegistry(): Failed to create the application's key! (Error - %li)\n", lResult);
187 return lResult;
188 }
189
190 /* Save the data into the registry value */
191 lResult = RegSetValueExW(hKey,
192 lpValueDataName,
193 0,
194 REG_SZ,
195 (BYTE *)lpValueData,
196 cchCount * sizeof(WCHAR));
197
198 if (lResult != ERROR_SUCCESS)
199 {
200 /* Bail out */
201 DPRINT("SaveStringToRegistry(): Failed to save the following value - \"%S\". (Error - %li)\n", lpValueDataName, lResult);
203 return lResult;
204 }
205
207 return lResult;
208}

Referenced by SaveSettings().

◆ wWinMain()

int WINAPI wWinMain ( HINSTANCE  hInst,
HINSTANCE  hPrev,
LPWSTR  Cmd,
int  iCmd 
)

Definition at line 671 of file charmap.c.

675{
677 INT Ret = 1;
678 HMODULE hRichEd20;
679 MSG Msg;
680
682
683 /* Mirroring code for the titlebar */
684 switch (GetUserDefaultUILanguage())
685 {
688 break;
689
690 default:
691 break;
692 }
693
694 iccx.dwSize = sizeof(INITCOMMONCONTROLSEX);
695 iccx.dwICC = ICC_TAB_CLASSES;
697
699 {
700 hRichEd20 = LoadLibraryW(L"RICHED20.DLL");
701
702 if (hRichEd20 != NULL)
703 {
705
706 for (;;)
707 {
708 if (GetMessage(&Msg, NULL, 0, 0) <= 0)
709 {
710 Ret = Msg.wParam;
711 break;
712 }
713
714 /* NOTE: CreateDialog needs IsDialogMessage call in message loop */
716 continue;
717#ifndef REMOVE_ADVANCED
719 continue;
720#endif
721
724 }
725
726 FreeLibrary(hRichEd20);
727 }
729 }
730
731 return Ret;
732}
static HWND InitInstance(HINSTANCE hInst)
Definition: charmap.c:608
HWND hAdvancedDlg
Definition: charmap.c:20
BOOL WINAPI InitCommonControlsEx(const INITCOMMONCONTROLSEX *lpInitCtrls)
Definition: commctrl.c:893
#define FreeLibrary(x)
Definition: compat.h:748
#define LoadLibraryW(x)
Definition: compat.h:747
LANGID WINAPI GetUserDefaultUILanguage(void)
Definition: locale.c:1374
HINSTANCE hInst
Definition: dxdiag.c:13
VOID UnregisterMapClasses(HINSTANCE hInstance)
Definition: map.c:875
BOOL RegisterMapClasses(HINSTANCE hInstance)
Definition: map.c:849
struct tagINITCOMMONCONTROLSEX INITCOMMONCONTROLSEX
#define ICC_TAB_CLASSES
Definition: commctrl.h:61
#define MAKELANGID(p, s)
Definition: nls.h:15
#define LANG_HEBREW
Definition: nls.h:67
#define SUBLANG_DEFAULT
Definition: nls.h:168
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
BOOL WINAPI SetProcessDefaultLayout(DWORD dwDefaultLayout)
Definition: window.c:1719
#define LAYOUT_RTL
Definition: wingdi.h:1371
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define IsDialogMessage
Definition: winuser.h:5818
#define GetMessage
Definition: winuser.h:5799
#define DispatchMessage
Definition: winuser.h:5774

Variable Documentation

◆ EnhancedKeyboard

KEYBOARD_STRUCT EnhancedKeyboard
extern

Definition at line 227 of file keyboard.c.

Referenced by OSK_SetKeys().

◆ Globals

OSK_GLOBALS Globals
extern

Definition at line 13 of file clipbrd.c.

◆ StandardKeyboard

KEYBOARD_STRUCT StandardKeyboard
extern

Definition at line 240 of file keyboard.c.

Referenced by OSK_SetKeys().