Code: Select all
#include "hmg.ch"
#define WM_CLOSE 16
#xtranslate VirtualKeyboard.FILENAME => "OSK.EXE"
#xtranslate VirtualKeyboard.FULLFILENAME => GetSystemDir()+"\"+VirtualKeyboard.FILENAME
#xtranslate VirtualKeyboard.HANDLE => _HMG_VirtualKeyboardGetHandle()
#xtranslate VirtualKeyboard.OPEN [ SHOW ] => EXECUTE FILE VirtualKeyboard.FULLFILENAME
#xtranslate VirtualKeyboard.OPEN HIDE => EXECUTE FILE VirtualKeyboard.FULLFILENAME HIDE
#xtranslate VirtualKeyboard.RELEASE => SendMessage (VirtualKeyboard.HANDLE, WM_CLOSE, 0, 0)
#xtranslate VirtualKeyboard.TITLE => GetWindowText (VirtualKeyboard.HANDLE)
#xtranslate VirtualKeyboard.TITLE := <arg> => SetWindowText (VirtualKeyboard.HANDLE, <arg>)
#xtranslate VirtualKeyboard.SHOW => ShowWindow (VirtualKeyboard.HANDLE)
#xtranslate VirtualKeyboard.HIDE => HideWindow (VirtualKeyboard.HANDLE)
#xtranslate VirtualKeyboard.IsVisible => IsWindowVisible (VirtualKeyboard.HANDLE)
#xtranslate VirtualKeyboard.IsOpen => IsValidWindowHandle (VirtualKeyboard.HANDLE)
#xtranslate VirtualKeyboard.IsRelease => .NOT. VirtualKeyboard.IsOpen
#xtranslate VirtualKeyboard.IsMinimize => IsMinimized (VirtualKeyboard.HANDLE)
#xtranslate VirtualKeyboard.IsMaximize => IsMaximized (VirtualKeyboard.HANDLE)
#xtranslate VirtualKeyboard.ROW => GetWindowRow ( VirtualKeyboard.HANDLE )
#xtranslate VirtualKeyboard.COL => GetWindowCol ( VirtualKeyboard.HANDLE )
#xtranslate VirtualKeyboard.WIDTH => GetWindowWidth ( VirtualKeyboard.HANDLE )
#xtranslate VirtualKeyboard.HEIGHT => GetWindowHeight ( VirtualKeyboard.HANDLE )
#xtranslate VirtualKeyboard.ROW := <arg> => _SetWindowSizePos ( VirtualKeyboard.HANDLE, <arg>, , , )
#xtranslate VirtualKeyboard.COL := <arg> => _SetWindowSizePos ( VirtualKeyboard.HANDLE, , <arg>, , )
#xtranslate VirtualKeyboard.WIDTH := <arg> => _SetWindowSizePos ( VirtualKeyboard.HANDLE, , , <arg>, )
#xtranslate VirtualKeyboard.HEIGHT := <arg> => _SetWindowSizePos ( VirtualKeyboard.HANDLE, , , , <arg> )
FUNCTION _HMG_VirtualKeyboardGetHandle
STATIC hWnd := 0
LOCAL nProcessID, aWin
IF IsValidWindowHandle (hWnd) == .F.
hWnd := 0
aWin := EnumWindows ()
FOR i = 1 TO HMG_LEN (aWin)
GetWindowThreadProcessId (aWin[i], NIL, @nProcessID)
IF HMG_UPPER (VirtualKeyboard.FILENAME) $ HMG_UPPER (GetProcessImageFileName(nProcessID))
hWnd := aWin[i]
EXIT
ENDIF
NEXT
ENDIF
RETURN hWnd
Function Main
aLanguages := { { 'Arabic', 0x0401 },;
{ 'English', 0x0409 },;
{ 'French', 0x040C },;
{ 'Polish', 0x0415 },;
{ 'Portuguese', 0x0416 },;
{ 'Turkish', 0x041F },;
{ 'Persian', 0x0429 },;
{ 'Azeri', 0x042C },;
{ 'Spanish', 0x040A } }
aLangNames := {}
aLangCodes := {}
AEVAL( aLanguages, { | a1 | AADD( aLangNames, a1[ 1 ] ), AADD( aLangCodes, a1[ 2 ] ) } )
cCurr_KLName := GetKeyboardLayoutName()
nCurr_KLNo := CTON( cCurr_KLName, 16 )
nInsKLNo := ASCAN( aLangCodes, nCurr_KLNo ) // Installed KBL no
DEFINE WINDOW Form_1;
AT 0,0 ;
WIDTH 600 HEIGHT 600 ;
MAIN ;
TITLE "System Virtual Keyboard";
ON RELEASE IF (VirtualKeyboard.IsOpen == .T., VirtualKeyboard.RELEASE, NIL)
ON KEY ESCAPE ACTION ThisWindow.Release
@ 50, 20 EDITBOX editbox_1 WIDTH 550 HEIGHT 350 VALUE ""
@ 20, 20 COMBOBOX cmbLangs WIDTH 550 HEIGHT 350 ITEMS aLangNames ON CHANGE ChangeUILang( This.Value ) VALUE nInsKLNo
@ 410, 280 BUTTON Button_1 CAPTION "On/Off" ACTION OnOff_VirtualKeyboard()
@ 450, 280 BUTTON Button_2 CAPTION "Release" ACTION IF (VirtualKeyboard.IsOpen == .T., VirtualKeyboard.RELEASE, NIL)
END WINDOW
CENTER WINDOW Form_1
ACTIVATE WINDOW Form_1
RETURN
PROCEDURE OnOff_VirtualKeyboard
IF VirtualKeyboard.IsOpen == .F.
IF .NOT. FILE (VirtualKeyboard.FULLFILENAME)
RETURN
ENDIF
VirtualKeyboard.OPEN HIDE
Inkey (1) // Wait until the application is loaded
VirtualKeyboard.TITLE := "HMG Virtual Keyboard"
VirtualKeyboard.ROW := Form_1.ROW + Form_1.editbox_1.ROW + 50
VirtualKeyboard.COL := Form_1.COL + Form_1.editbox_1.COL + 20
VirtualKeyboard.SHOW
RETURN
ENDIF
IF VirtualKeyboard.IsVisible == .F.
VirtualKeyboard.SHOW
ELSE
VirtualKeyboard.HIDE
ENDIF
RETURN
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.
PROCEDURE ChangeUILang( nSelected )
nCurr_KLNo := aLangCodes[ nSelected ]
ActivateKeyboardLayout( nCurr_KLNo )
RETURN // ChangeUILang()
*-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.-._.
#pragma BEGINDUMP
#include "SET_COMPILE_HMG_UNICODE.ch"
#include "HMG_UNICODE.h"
#include <windows.h>
#include <tchar.h>
#include "hbapi.h"
#include "hbapiitm.h"
HB_FUNC ( GETKEYBOARDLAYOUTNAME )
{
TCHAR cKLID [ KL_NAMELENGTH + 1 ];
GetKeyboardLayoutName (cKLID);
HMG_retc (cKLID);
}
HB_FUNC ( ACTIVATEKEYBOARDLAYOUT )
{
HKL hkl = (HKL) HMG_parnl (1);
UINT Flags = (UINT) hb_parni (2);
HKL old_hkl = ActivateKeyboardLayout (hkl, Flags);
HMG_retnl ((LONG_PTR) old_hkl );
}
// GetProcessImageFileName ( [ nProcessID ] ) --> return cProcessImageFileName
HB_FUNC ( GETPROCESSIMAGEFILENAME )
{
typedef DWORD (WINAPI *Func_GetProcessImageFileName) (HANDLE,LPTSTR,DWORD);
static Func_GetProcessImageFileName pGetProcessImageFileName = NULL;
if (pGetProcessImageFileName == NULL)
{ HMODULE hLib = LoadLibrary (_TEXT("Psapi.dll"));
#ifdef UNICODE
pGetProcessImageFileName = (Func_GetProcessImageFileName) GetProcAddress(hLib, "GetProcessImageFileNameW");
#else
pGetProcessImageFileName = (Func_GetProcessImageFileName) GetProcAddress(hLib, "GetProcessImageFileNameA");
#endif
}
if (pGetProcessImageFileName == NULL)
return; // return NIL
DWORD ProcessID = HB_ISNUM (1) ? (DWORD) hb_parnl(1) : GetCurrentProcessId();
TCHAR cProcessFullName [ MAX_PATH ] = _TEXT ("");
HANDLE hProcess = OpenProcess ( PROCESS_QUERY_INFORMATION, FALSE, ProcessID );
if ( hProcess != NULL )
{ pGetProcessImageFileName (hProcess, cProcessFullName, sizeof(cProcessFullName)/sizeof(TCHAR));
CloseHandle (hProcess);
HMG_retc (cProcessFullName);
}
return; // return NIL
}
extern PHB_ITEM pArray;
BOOL CALLBACK EnumWindowsProc (HWND hWnd, LPARAM lParam)
{
UNREFERENCED_PARAMETER (lParam);
hb_arrayAddForward (pArray, hb_itemPutNLL (NULL, (LONG_PTR) hWnd));
return TRUE;
}
HB_FUNC ( ENUMWINDOWS )
{
pArray = hb_itemArrayNew ( 0 );
EnumWindows ((WNDENUMPROC) EnumWindowsProc, (LPARAM) 0);
hb_itemReturnRelease ( pArray );
pArray = NULL;
}
// GetWindowThreadProcessId (hWnd, @nThread, @nProcessID)
HB_FUNC ( GETWINDOWTHREADPROCESSID )
{
HWND hWnd = (HWND) HMG_parnl (1);
DWORD nThread, nProcessID;
nThread = GetWindowThreadProcessId (hWnd, &nProcessID);
if ( HB_ISBYREF(2) )
hb_storni (nThread, 2);
if ( HB_ISBYREF(3) )
hb_storni (nProcessID, 3);
}
#pragma ENDDUMP