#COMPILE EXE "Ctrl+Maj.exe" #DIM ALL $Label1 = "Prêt à intercepter, diminuez la fenêtre puis tapez Ctrl+M" + $CR + "pour convertir une lettre accentuée en majuscule" $Label2 = "Tapez maintenant la minuscule accentuée à convertir..." + $CR + "(si ça ne marche pas, baissez la fenêtre puis Ctrl+M)" #RESOURCE MANIFEST 1, "XPTheme.xml" #RESOURCE ICON, A, "icon.ico" #RESOURCE VERSIONINFO #RESOURCE FILEVERSION 1,0,0,0 #RESOURCE STRINGINFO "0409", "0000" #RESOURCE VERSION$ "CompanyName", "mougino software" #RESOURCE VERSION$ "LegalCopyright", "(c) 2019 mougino" #RESOURCE VERSION$ "ProductName", "Ctrl+Maj" #RESOURCE VERSION$ "ProductVersion", "1.0" #RESOURCE VERSION$ "FileDescription", "http://mougino.free.fr" #INCLUDE ONCE "Win32Api.Inc" #INCLUDE ONCE "SendKeys.Inc" '-------------------------------------------------------------------------------- FUNCTION PBMAIN () AS LONG ShowMain %HWND_DESKTOP END FUNCTION '-------------------------------------------------------------------------------- GLOBAL vk AS WORD ' virtual key GLOBAL mo AS WORD ' modifier (alt, ctl, shift) '-------------------------------------------------------------------------------- THREAD FUNCTION PrintMaj(BYVAL hDlg AS DWORD) AS LONG LOCAL hD AS DWORD LOCAL e AS STRING LOCAL zCaption AS ASCIIZ*200 ' We caught the input > minimize the dialog DIALOG SEND hDlg, %WM_USER + 1000, 0, 0 hD = GetForegroundWindow() GetWindowText(hD, zCaption, 200) IF TRIM$(zCaption) <> "Ctrl+Maj" THEN SELECT CASE vk CASE 50 : e = "É" ' é CASE 48 : e = "À" ' à CASE 57 : e = "Ç" ' ç CASE 55 : e = "È" ' è CASE 192 : e = "Ù" ' ù END SELECT IF e <> "" THEN SendString e END IF FUNCTION = 1 END FUNCTION '-------------------------------------------------------------------------------- '-------------------------------------------------------------------------------- CALLBACK FUNCTION ProcMain() STATIC nAtom AS DWORD STATIC hThread AS DWORD LOCAL lRes AS LONG STATIC firstUp AS LONG SELECT CASE CB.MSG CASE %WM_INITDIALOG ' Set up atom for hotkey registration nAtom = GlobalAddAtom ("Ctrl+Maj" + STR$(TIMER)) mo = 2 ' Ctrl vk = 77 ' M IF RegisterHotKey (CB.HNDL, nAtom, mo, vk) = 0 THEN DIALOG END CB.HNDL ' Ctrl+M already registered CONTROL SET TEXT CB.HNDL, 100, $Label1 CASE %WM_HOTKEY ' Hotkey detected IF firstUp > 0 THEN CONTROL SET TEXT CB.HNDL, 100, $Label2 DIALOG NORMALIZE CB.HNDL INCR firstUp CASE %WM_KEYDOWN ' Key press event vk = CB.WPARAM mo = CB.LPARAM IF hThread THEN THREAD CLOSE hThread TO lRes THREAD CREATE PrintMaj(BYVAL CB.HNDL) TO hThread FUNCTION = 1 CASE %WM_USER + 1000 DIALOG MINIMIZE CB.HNDL CONTROL SET TEXT CB.HNDL, 100, $Label1 CASE %WM_DESTROY UnregisterHotKey CB.HNDL, nAtom ' Clean up hotkey GlobalDeleteAtom nAtom ' and atom END SELECT END FUNCTION '-------------------------------------------------------------------------------- '-------------------------------------------------------------------------------- FUNCTION ShowMain(BYVAL hParent AS DWORD) AS LONG LOCAL lRes AS LONG LOCAL hDlg AS DWORD LOCAL hEdit AS DWORD DIALOG NEW hParent, "Ctrl+Maj", , , 180, 40, %WS_POPUP OR _ %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_MINIMIZEBOX OR _ %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR _ %DS_3DLOOK OR %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_WINDOWEDGE OR _ %WS_EX_CONTROLPARENT OR %WS_EX_LEFT OR %WS_EX_LTRREADING OR _ %WS_EX_RIGHTSCROLLBAR, TO hDlg DIALOG SET ICON hDlg, "A" ' Subclassed textbox to trap key presses CONTROL ADD TEXTBOX, hDlg, 102, "", -1, -1, 0, 0 CONTROL HANDLE hDlg, 102 TO hEdit SetWindowLong(hEdit, %GWL_WNDPROC, CODEPTR(ProcMain)) ' Hotkey control: CONTROL ADD "msctls_hotkey32", hDlg, 101, _ "msctls_hotkey321", -1, -1, 0, 0, %WS_CHILD OR %WS_VISIBLE, _ %WS_EX_CLIENTEDGE OR %WS_EX_LEFT OR %WS_EX_LTRREADING CONTROL ADD LABEL, hDlg, 100, $Label1, 2, 10, 176, 30 DIALOG SHOW MODAL hDlg, CALL ProcMain TO lRes FUNCTION = lRes END FUNCTION '--------------------------------------------------------------------------------