Собственно, для чего это я сейчас за 8 минут настругал ?
А для того что бы проучить тут некоторых на фоурме, и показать что не надо все пихать в dll
Пример использования
А для того что бы проучить тут некоторых на фоурме, и показать что не надо все пихать в dll
PHP код:
define('KLF_ACTIVATE', 0x00000001);
define('ENGLISH', '00000409');
define('RUSSIAN', '00000419');
function Infs() {
static $a;
if($a===null)
$a = new ffi("
[lib='User32.dll']
int GetForegroundWindow();
DWORD GetWindowThreadProcessId(int hWnd, int lpdwProcessId);
int GetKeyboardLayout(DWORD idThread);
int LoadKeyboardLayoutA(char *pwszKLID, int Flags);
int ActivateKeyboardLayout(int hkl, int Flags);
");
return $a;
}
function GetNameLayout($i) {
$Layout = array(0x409 => 'English', 0x419 => 'Русский');
$Layout = $Layout[$i];
return $Layout;
}
function GetActiveLayout() {
$h = Infs();
return ($h->GetKeyboardLayout($h->GetWindowThreadProcessId($h->GetForegroundWindow(), null)) >> 0x10);
}
function GetMyActiveLayout() {
return (Infs()->GetKeyboardLayout(0) >> 0x10);
}
function SetLayout($Layout) {
Infs()->ActivateKeyboardLayout(Infs()->LoadKeyboardLayoutA($Layout, 0), KLF_ACTIVATE);
}
function SetMyActiveLayout($Layout) {
$h = Infs();
sendMessage($h->GetForegroundWindow(), 0x0050,1, $h->LoadKeyboardLayoutA($Layout, 0));
}
PHP код:
// Получаем системную расклдку
$Info['SystemKeyCodeLayout'] = GetActiveLayout();
$Info['SystemNameCodeLayout'] = GetNameLayout($Info['SystemKeyCodeLayout']);
// Получаем нашу раскладку программы
$Info['MyKeyCodeLayout'] = GetMyActiveLayout();
$Info['MyNameCodeLayout'] = GetNameLayout($Info['MyKeyCodeLayout']);
// Устанавливем системную раскалдку в зависимости от той что у нас стоит
$lang = ($Info['SystemNameCodeLayout'] == 'English') ? RUSSIAN : ENGLISH;
SetLayout($lang);
// Устанавливем раскалдку в нашей программе, в зависимости от той что у нас стоит
$lang = ($Info['MyNameCodeLayout'] == 'English') ? RUSSIAN : ENGLISH;
SetMyActiveLayout($lang);
// И уснова узнаем что у нас там
// Получаем системную расклдку
$Info['Result']['SystemKeyCodeLayout'] = GetActiveLayout();
$Info['Result']['SystemNameCodeLayout'] = GetNameLayout($Info['Result']['SystemKeyCodeLayout']);
// Получаем нашу раскладку программы
$Info['Result']['MyKeyCodeLayout'] = GetMyActiveLayout();
$Info['Result']['MyNameCodeLayout'] = GetNameLayout($Info['Result']['MyKeyCodeLayout']);
pre($Info); // Выводим