ReactOS 0.4.15-dev-5884-gab5aff5
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:47
#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:3356
LONG WINAPI RegQueryValueExW(_In_ HKEY hkeyorg, _In_ LPCWSTR name, _In_ LPDWORD reserved, _In_ LPDWORD type, _In_ LPBYTE data, _In_ LPDWORD count)
Definition: reg.c:4121
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:71
#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:2425
#define MF_CHECKED
Definition: winuser.h:132
HWND WINAPI GetDlgItem(_In_opt_ HWND, _In_ int)
#define BM_CLICK
Definition: winuser.h:1907
#define SendDlgItemMessage
Definition: winuser.h:5832
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 490 of file main.c.

491{
493
494 /* Release Ctrl, Shift, Alt keys */
495 OSK_ReleaseKey(SCAN_CODE_44); // Left shift
496 OSK_ReleaseKey(SCAN_CODE_57); // Right shift
497 OSK_ReleaseKey(SCAN_CODE_58); // Left ctrl
498 OSK_ReleaseKey(SCAN_CODE_60); // Left alt
499 OSK_ReleaseKey(SCAN_CODE_62); // Right alt
500 OSK_ReleaseKey(SCAN_CODE_64); // Right ctrl
501
502 /* Destroy child controls */
504
505 /* delete GDI objects */
508
509 /* Save the application's settings on registry */
510 SaveSettings();
511
512 return TRUE;
513}
void SaveSettings(void)
Definition: settings.c:115
VOID OSK_DestroyKeys(VOID)
Definition: main.c:162
BOOL OSK_ReleaseKey(WORD ScanCode)
Definition: main.c:715
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 619 of file main.c.

620{
622 INPUT Input;
623 BOOL bExtendedKey;
624 BOOL bKeyDown;
625 BOOL bKeyUp;
626 LONG WindowStyle;
627 INT i;
628
629 /* KeyDown and/or KeyUp ? */
630 WindowStyle = GetWindowLongW(hWndControl, GWL_STYLE);
631 if ((WindowStyle & BS_AUTOCHECKBOX) == BS_AUTOCHECKBOX)
632 {
633 /* 2-states key like Shift, Alt, Ctrl, ... */
634 if (SendMessageW(hWndControl, BM_GETCHECK, 0, 0) == BST_CHECKED)
635 {
636 bKeyDown = TRUE;
637 bKeyUp = FALSE;
638 }
639 else
640 {
641 bKeyDown = FALSE;
642 bKeyUp = TRUE;
643 }
644 }
645 else
646 {
647 /* Other key */
648 bKeyDown = TRUE;
649 bKeyUp = TRUE;
650 }
651
652 /* Get the key from dialog control key command */
653 ScanCode = wCommand;
654
655 /*
656 The user could've pushed one of the key buttons of the dialog that
657 can trigger particular function toggling (Caps Lock, Num Lock or Scroll Lock). Update
658 (invalidate) the LED icon resources accordingly.
659 */
660 for (i = 0; i < _countof(LedKey); i++)
661 {
662 if (LedKey[i].wScanCode == ScanCode)
663 {
665 }
666 }
667
668 /* Extended key ? */
669 if (ScanCode & 0x0200)
670 bExtendedKey = TRUE;
671 else
672 bExtendedKey = FALSE;
674
675 /* Press and release the key */
676 if (bKeyDown)
677 {
678 Input.type = INPUT_KEYBOARD;
679 Input.ki.wVk = 0;
680 Input.ki.wScan = ScanCode;
681 Input.ki.time = GetTickCount();
682 Input.ki.dwExtraInfo = GetMessageExtraInfo();
683 Input.ki.dwFlags = KEYEVENTF_SCANCODE;
684 if (bExtendedKey) Input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
685 SendInput(1, &Input, sizeof(Input));
686 }
687
688 if (bKeyUp)
689 {
690 Input.type = INPUT_KEYBOARD;
691 Input.ki.wVk = 0;
692 Input.ki.wScan = ScanCode;
693 Input.ki.time = GetTickCount();
694 Input.ki.dwExtraInfo = GetMessageExtraInfo();
695 Input.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
696 if (bExtendedKey) Input.ki.dwFlags |= KEYEVENTF_EXTENDEDKEY;
697 SendInput(1, &Input, sizeof(Input));
698 }
699
700 /* Play the sound during clicking event (only if "Use Click Sound" menu option is ticked) */
702 {
704 }
705
706 return TRUE;
707}
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:531
@ Input
Definition: arc.h:84
#define _countof(array)
Definition: sndvol32.h:68
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:3698
LONG WINAPI GetWindowLongW(_In_ HWND, _In_ int)
#define KEYEVENTF_EXTENDEDKEY
Definition: winuser.h:1095
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
#define MAKEINTRESOURCEW(i)
Definition: winuser.h:582
#define GWL_STYLE
Definition: winuser.h:846
LPARAM WINAPI GetMessageExtraInfo(void)
Definition: message.c:1340
#define KEYEVENTF_KEYUP
Definition: winuser.h:1096
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define BST_CHECKED
Definition: winuser.h:197
#define BM_GETCHECK
Definition: winuser.h:1908

Referenced by OSK_WndProc().

◆ OSK_Create()

LRESULT OSK_Create ( HWND  hwnd)

Definition at line 372 of file main.c.

373{
374 HMONITOR monitor;
376 POINT Pt;
377 RECT rcWindow, rcDlgIntersect;
378 LOGFONTW lf = {0};
379
380 /* Save handle */
382
383 /* Init Font */
387
388 if (OSK_SetKeys(SETKEYS_INIT) == -1)
389 return -1;
390
391 /* Check the checked menu item before displaying the window */
393 {
394 /* Enhanced keyboard dialog chosen, set the respective menu item as checked */
397 }
398 else
399 {
400 /* Standard keyboard dialog chosen, set the respective menu item as checked */
403 }
404
405 /* Check if the "Click Sound" option was chosen before (and if so, then tick the menu item) */
407 {
409 }
410
411 /* Get screen info */
412 memset(&Pt, 0, sizeof(Pt));
413 monitor = MonitorFromPoint(Pt, MONITOR_DEFAULTTOPRIMARY);
414 info.cbSize = sizeof(info);
415 GetMonitorInfoW(monitor, &info);
416 GetWindowRect(hwnd, &rcWindow);
417
418 /*
419 If the coordination values are default then re-initialize using the specific formulas
420 to move the dialog at the bottom of the screen.
421 */
423 {
424 Globals.PosX = (info.rcMonitor.left + info.rcMonitor.right - (rcWindow.right - rcWindow.left)) / 2;
425 Globals.PosY = info.rcMonitor.bottom - (rcWindow.bottom - rcWindow.top);
426 }
427
428 /*
429 Calculate the intersection of two rectangle sources (dialog and work desktop area).
430 If such sources do not intersect, then the dialog is deemed as "off screen".
431 */
432 if (IntersectRect(&rcDlgIntersect, &rcWindow, &info.rcWork) == 0)
433 {
434 Globals.PosX = (info.rcMonitor.left + info.rcMonitor.right - (rcWindow.right - rcWindow.left)) / 2;
435 Globals.PosY = info.rcMonitor.bottom - (rcWindow.bottom - rcWindow.top);
436 }
437 else
438 {
439 /*
440 There's still some intersection but we're not for sure if it is sufficient (the dialog could also be partially hidden).
441 Therefore, check the remaining intersection if it's enough.
442 */
443 if (rcWindow.top < info.rcWork.top || rcWindow.left < info.rcWork.left || rcWindow.right > info.rcWork.right || rcWindow.bottom > info.rcWork.bottom)
444 {
445 Globals.PosX = (info.rcMonitor.left + info.rcMonitor.right - (rcWindow.right - rcWindow.left)) / 2;
446 Globals.PosY = info.rcMonitor.bottom - (rcWindow.bottom - rcWindow.top);
447 }
448 }
449
450 /*
451 Place the window (with respective placement coordinates) as topmost, above
452 every window which are not on top or are at the bottom of the Z order.
453 */
455 {
458 }
459 else
460 {
463 }
464
465 /* Create a green brush for leds */
467
468 /* Set a timer for periodic tasks */
469 Globals.iTimer = SetTimer(hwnd, 0, 100, NULL);
470
471 /* If the member of the struct (bShowWarning) is set then display the dialog box */
473 {
474 /* If for whatever reason the thread fails to be created then handle the dialog box in main thread... */
476 {
478 }
479 }
480
481 return 0;
482}
DWORD WINAPI OSK_WarningDlgThread(LPVOID lpParameter)
Definition: main.c:124
LRESULT OSK_SetKeys(int reason)
Definition: main.c:188
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:62
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:1198
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:4389
#define SWP_NOSIZE
Definition: winuser.h:1235
#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:1196
HMENU WINAPI GetMenu(_In_ HWND)

Referenced by OSK_WndProc().

◆ OSK_RefreshLEDKeys()

VOID OSK_RefreshLEDKeys ( VOID  )

Definition at line 522 of file main.c.

523{
524 INT i;
525 BOOL bKeyIsPressed;
526
527 for (i = 0; i < _countof(LedKey); i++)
528 {
529 bKeyIsPressed = (GetAsyncKeyState(LedKey[i].vKey) & 0x8000) != 0;
530 if (LedKey[i].bWasKeyPressed != bKeyIsPressed)
531 {
532 LedKey[i].bWasKeyPressed = bKeyIsPressed;
534 }
535 }
536}
SHORT WINAPI GetAsyncKeyState(_In_ int)

Referenced by OSK_Timer().

◆ OSK_ReleaseKey()

BOOL OSK_ReleaseKey ( WORD  ScanCode)

Definition at line 715 of file main.c.

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

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
HANDLE WINAPI LoadImageW(_In_opt_ HINSTANCE, _In_ LPCWSTR, _In_ UINT, _In_ int, _In_ int, _In_ UINT)
Definition: cursoricon.c:2172
#define IMAGE_ICON
Definition: winuser.h:212
#define BM_SETIMAGE
Definition: winuser.h:1912
#define LR_DEFAULTCOLOR
Definition: winuser.h:1081
BOOL WINAPI DestroyIcon(_In_ HICON)
Definition: cursoricon.c:2022

Referenced by OSK_SetKeys().

◆ OSK_Timer()

int OSK_Timer ( void  )

Definition at line 544 of file main.c.

545{
546 HWND hWndActiveWindow;
547 DWORD dwThread;
548 HKL hKeyboardLayout;
549
550 hWndActiveWindow = GetForegroundWindow();
551 if (hWndActiveWindow != NULL && hWndActiveWindow != Globals.hMainWnd)
552 {
553 /* Grab the current keyboard layout from the foreground window */
554 dwThread = GetWindowThreadProcessId(hWndActiveWindow, NULL);
555 hKeyboardLayout = GetKeyboardLayout(dwThread);
556 /* Activate the layout */
557 ActivateKeyboardLayout(hKeyboardLayout, 0);
558 }
559
560 /*
561 Update the LED key indicators accordingly to their state (if one
562 of the specific keys is held down).
563 */
565 /* Update the buttons */
567
568 return TRUE;
569}
VOID OSK_RefreshLEDKeys(VOID)
Definition: main.c:522
UINT_PTR HKL
Definition: msctf.idl:104
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
struct @1609 Msg[]
LPARAM lParam
Definition: combotst.c:139
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define LOWORD(l)
Definition: pedump.c:82
#define IDCANCEL
Definition: winuser.h:825
#define WM_COMMAND
Definition: winuser.h:1730
#define WM_INITDIALOG
Definition: winuser.h:1729
#define IDOK
Definition: winuser.h:824
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 797 of file main.c.

798{
799 switch (msg)
800 {
801 case WM_CREATE:
802 return OSK_Create(hwnd);
803
804 case WM_PAINT:
805 return OSK_Paint(hwnd);
806
807 case WM_TIMER:
808 return OSK_Timer();
809
812 {
813 if (GetKeyState(VK_NUMLOCK) & 0x0001)
815 else
817 }
819 {
820 if (GetKeyState(VK_CAPITAL) & 0x0001)
822 else
824 }
826 {
827 if (GetKeyState(VK_SCROLL) & 0x0001)
829 else
831 }
832 break;
833
834 case WM_COMMAND:
835 switch (LOWORD(wParam))
836 {
837 case IDM_EXIT:
838 {
839 PostMessageW(hwnd, WM_CLOSE, 0, 0);
840 break;
841 }
842
843 case IDM_ENHANCED_KB:
844 {
846 {
847 /*
848 The user attempted to switch to enhanced keyboard dialog type.
849 Set the member value as TRUE, destroy the dialog and save the data configuration into the registry.
850 */
852 SaveSettings();
853
854 /* Change the condition of enhanced keyboard item menu to checked */
857
858 /* Finally, update the key layout */
859 LoadSettings();
861 }
862
863 break;
864 }
865
866 case IDM_STANDARD_KB:
867 {
869 {
870 /*
871 The user attempted to switch to standard keyboard dialog type.
872 Set the member value as FALSE, destroy the dialog and save the data configuration into the registry.
873 */
875 SaveSettings();
876
877 /* Change the condition of standard keyboard item menu to checked */
880
881 /* Finally, update the key layout */
882 LoadSettings();
884 }
885
886 break;
887 }
888
889 case IDM_CLICK_SOUND:
890 {
891 /*
892 This case is triggered when the user attempts to click on the menu item. Before doing anything,
893 we must check the condition state of such menu item so that we can tick/untick the menu item accordingly.
894 */
895 if (!Globals.bSoundClick)
896 {
899 }
900 else
901 {
904 }
905
906 break;
907 }
908
909 case IDM_ON_TOP:
910 {
911 /*
912 Check the condition state before disabling/enabling the menu
913 item and change the topmost order.
914 */
916 {
920 }
921 else
922 {
926 }
927
928 break;
929 }
930
931 case IDM_FONT:
932 {
934 break;
935 }
936
937 case IDM_ABOUT:
938 {
939 OSK_About();
940 break;
941 }
942
943 default:
945 break;
946 }
947 return 0;
948
949 case WM_THEMECHANGED:
950 /* Redraw the dialog (and its control buttons) using the new theme */
952 return 0;
953
954 case WM_CLOSE:
955 OSK_Close();
957 return 0;
958 }
960}
#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:577
LRESULT OSK_Create(HWND hwnd)
Definition: main.c:372
BOOL OSK_Command(WPARAM wCommand, HWND hWndControl)
Definition: main.c:619
LRESULT OSK_Paint(HWND hwnd)
Definition: main.c:756
VOID OSK_About(VOID)
Definition: main.c:138
int OSK_Timer(void)
Definition: main.c:544
int OSK_Close(void)
Definition: main.c:490
#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:1610
#define WM_CTLCOLORSTATIC
Definition: winuser.h:1762
#define WM_CLOSE
Definition: winuser.h:1611
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:1598
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define VK_CAPITAL
Definition: winuser.h:2196
#define SWP_NOMOVE
Definition: winuser.h:1234
#define VK_SCROLL
Definition: winuser.h:2270
#define WM_TIMER
Definition: winuser.h:1732
#define VK_NUMLOCK
Definition: winuser.h:2269
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:1091
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:4900
#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
HINSTANCE hInst
Definition: dxdiag.c:13
LANGID WINAPI GetUserDefaultUILanguage(void)
Definition: lang.c:810
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:1720
#define LAYOUT_RTL
Definition: wingdi.h:1371
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define IsDialogMessage
Definition: winuser.h:5799
#define GetMessage
Definition: winuser.h:5780
#define DispatchMessage
Definition: winuser.h:5755

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().