Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];

Вниз

Как сделать окно активным.   Найти похожие ветки 

 
Nikfel ©   (2007-06-21 17:28) [0]

Подскажите как вывести на передний план чужое окно, зная его handl c помощью функции FindWindow.


 
Инс   (2007-06-21 17:29) [1]

SetForegroundWindow


 
Инс   (2007-06-21 17:34) [2]

В дополнение. Начиная с Windows 2000 введена блокировка всплывающих окон. Если пользователь работает с чужим приложением, то ваше не всплывет, а будет мигать на панели задачь. если несмотря ни на что вы хотите, чтобы ваше окно всплыло поверх других, то есть пару трюков. По хорошему, нужно, чтобы чужое приложение вызывало AllowForegroundWindows, но сработает и такой код:
function ForceForegroundWindow(Wnd:HWND):Boolean;
var
 ForegroundWnd:HWND;
 ActiveThread,WndThread:DWORD;
 Attached:Boolean;
begin
 ForegroundWnd:=GetForegroundWindow;
 Attached:=False;
 if ForegroundWnd<>0 then begin
   ActiveThread:=GetWindowThreadProcessId(ForegroundWnd,nil);
   WndThread:=GetWindowThreadProcessId(Wnd,nil);
   if ActiveThread<>WndThread then
     Attached:=AttachThreadInput(WndThread,ActiveThread,True)
 end;
 Result:=SetForegroundWindow(Wnd);
 if Attached then AttachThreadInput(WndThread,ActiveThread,False);
end;


И даже такой, хотя если с предыдущим все ясно, то с этим непонятно, почему он работает.

function ForceForegroundWindow(Wnd:HWND):Boolean;
var
 Input:TInput;
begin
 FillChar(Input,SizeOf(Input),0);
 SendInput(1,Input,SizeOf(TInput));
 Result:=SetForegroundWindow(Wnd);
end;


 
Leonid Troyanovsky ©   (2007-06-21 18:13) [3]


> Инс   (21.06.07 17:34) [2]

> несмотря ни на что вы хотите, чтобы ваше окно всплыло поверх
> других, то есть пару трюков.

В печь ее [проф. Преображенский].

> И даже такой, хотя если с предыдущим все ясно, то с этим
> непонятно, почему он работает.

Во-первых, не ясно и с первым, а,  во-вторых,
непонятно, почему известно, что он работает.

--
Regards, LVT.


 
Инс   (2007-06-21 18:21) [4]


> В печь ее

Десятый раз отвечаю на подобный вопрос, и всегда говорил, что это не хорошо. Повторю еще раз: ПО ХОРОШЕМУ, ЧУЖОЕ ПРИЛОЖЕНИЕ ДОЛЖНО ВЫЗЫВАТЬ ALLOWFOREGROUNDWINDOW!!!


> Во-первых, не ясно и с первым


Рихтера почитайте, тогда ясно будет. Всплывать может только окно потока, подключенного к очереди клавиатурного ввода. А в первом коде мы искуственно подключам наш поток к нему.


> непонятно, почему известно, что он работает

Тыщу раз использовал! Не верите - проверьте.


 
Инс   (2007-06-21 18:30) [5]


> окно потока, подключенного к очереди клавиатурного ввода


Иногда можно еще встретить термин Foreground Thread


 
Leonid Troyanovsky ©   (2007-06-21 18:47) [6]


> Инс   (21.06.07 18:21) [4]

> ПРИЛОЖЕНИЕ ДОЛЖНО ВЫЗЫВАТЬ ALLOWFOREGROUNDWINDOW!!!

Во-первых, не надо на меня кричать, я и не собирался
преступным путем вытаскивать левые окна foreground.

Во-вторых, AFGW здесь причем только поскольку
в msdn в статье ей посвященной есть перечень ограничений,
которые некоторым следовало бы выучить наизусть.

> Рихтера почитайте, тогда ясно будет. Всплывать может только

Рихтер-то тут причем? Он подобным всплытием, слава Богу,
не страдает.

>  А в первом коде мы искуственно подключам наш поток к нему.

Возможно, что SFGW просто спутана, скажем, с SetFocus.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-06-21 18:54) [7]


> Инс   (21.06.07 18:21) [4]

> Тыщу раз использовал! Не верите - проверьте.

Даже пробывать не буду, бо бред.

Вот, допустим, я узнал некий бронебойный метод.
Но, если я про него буду везде рассказывать, то стану
нарушителем конвенции, и, кроме того, вынужу
MS залатать оную дыру.
Т.е., никакой пользы в расспространении подобных знаний нет.
Как, впрочем, и нет пользы в подобных методах :)

--
Regards, LVT.


 
Инс   (2007-06-21 19:13) [8]


> Во-первых, не надо на меня кричать


Да я не на Вас кричу, Вы мне ничего плохого не сделали. Если у Вас сложилось такое впечатление, то искренне прошу прощения. Это крик души ;)


> Во-вторых, AFGW здесь причем только поскольку
> в msdn в статье ей посвященной есть перечень ограничений,
> которые некоторым следовало бы выучить наизусть.


Хм, о чем это Вы? Даже специально залез в MSDN, ничего особенного в remarks не нашел.


> Рихтер-то тут причем? Он подобным всплытием, слава Богу,
>
> не страдает


Там достаточно подробно описано работы всплывающих окон.


> Возможно, что SFGW просто спутана, скажем, с SetFocus.


Брр. Не понял, что с чем спутано? В первом коде мы получаем foreground-окно, идентификатор потока, который его создал, и подключаем нашу очередь виртуального ввода к нему. Таким образом, наш поток становится подключенным к очереди виртуального ввода. Она только одна, и ей обладает поток верхнего уровня (Foreground Thread). Теперь всплывающие окна нашего потока не будут заблокированы. А причем тут SetFocus? Он фокусом ввода управляет, а фокус у каждого потока свой (в отличие от очереди виртуального ввода, которая только одна)


 
Инс   (2007-06-21 19:17) [9]


> Как, впрочем, и нет пользы в подобных методах


Не скажите. Ни кому не нравится просыпаться утром от звука будильника, но тем не менее, все понимают, что он нужен ;) Это я к чему. В каких-нибудь органайзерах-будильниках, порой нужно, чтобы окно нагло влезло несмотря ни на что, иначе пользователь может его просто не заметить. Или, например, ICQ пользуетесь? Там окошки с сообщением тоже всплывают, когда ICQ неактивно.


 
Nikfel ©   (2007-06-21 19:33) [10]

Спасибо функция SetForegroundWindow работает. Остольное пока не проверял.


 
Инс   (2007-06-21 19:37) [11]

Вообще, не понимаю, о чем мы спорим? Вы считаете, что код не рабочий? Если да, то вы объективно неправы. Жаль что не хотите проверять, ну да ладно, это Ваше дело, я не буду настаивать ;) А если вы утверждаете, что код рабочий, но вот делать так категорически не надо, то тут частично соглашусь. Почему частично, я уже объяснял в [9]


 
Инс   (2007-06-21 19:39) [12]

О! Еще пример, когда можно воспользоваться этим способом: запускается второй экземпляр приложения, при этом нужно не допустить повторного запуска, а найти окно предыдущего экземпляра и поместить его наверх.


 
Leonid Troyanovsky ©   (2007-06-21 20:25) [13]


> Инс   (21.06.07 19:13) [8]

> Хм, о чем это Вы? Даже специально залез в MSDN, ничего особенного
> в remarks не нашел.

Remarks

Starting with Microsoft Windows 98 and Windows 2000, the system restricts which processes can set the foreground window. A process can set the foreground window only if one of the following conditions is true:

The process is the foreground process.
The process was started by the foreground process.
The process received the last input event.
There is no foreground process.
The foreground process is being debugged.
The foreground is not locked (see LockSetForegroundWindow).
The foreground lock time-out has expired (see SPI_GETFOREGROUNDLOCKTIMEOUT in SystemParametersInfo).

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-06-21 20:29) [14]


> Инс   (21.06.07 19:37) [11]

> не рабочий? Если да, то вы объективно неправы. Жаль что
> не хотите проверять, ну да ладно, это Ваше дело, я не буду
> настаивать ;) А если вы утверждаете, что код рабочий, но
> вот делать так категорически не надо, то тут частично соглашусь.

Код нерабочий, а методы бесполезные (вредные).
Ранее здесь уже частично объяснял.

--
Regards, LVT.


 
Инс   (2007-06-21 20:31) [15]

Я это читал :) И? На что я должен обратить внимание? И почему? Что из написанного в MSDN противоречит моим словам?
Кстати,

> которые некоторым следовало бы выучить наизусть

Наизусть учить SDK - бред (Вы первые начали употребление таких слов). Но я этим не ограничусь, а приведу аргумент, который и так, думаю, Вам известен. Умный не тот, кто много знает, а тот, кто умеет найти информацию и воспользоваться ей.


 
Leonid Troyanovsky ©   (2007-06-21 20:32) [16]


> Инс   (21.06.07 19:39) [12]

> О! Еще пример, когда можно воспользоваться этим способом:
>  запускается второй экземпляр приложения, при этом нужно
> не допустить повторного запуска, а найти окно предыдущего
> экземпляра и поместить его наверх.

Эта другая песня, здесь ничего нарушать не надо,
см. [13] первые два пункта ограничений.

--
Regards, LVT.


 
Инс   (2007-06-21 20:37) [17]


> Код нерабочий...


По поводу вредности - это Ваше субъективное мнение. А по поводу нерабочести... Эх, не получается у нас конструктивного спора, так как некоторые просто не хотят слушать собеседника, проверять его аргументы и приводить свои. В таком ключе я дальше беседовать не намерен. Какая-то дедовщина у Вас тут! Почему-то "старожилы" форума, думают, что мозги есть только у них. До свидания!


 
Инс   (2007-06-21 20:43) [18]


> см. [13] первые два пункта ограничений.


Нет, все-таки отвечу. Смотрю. А теперь представьте ситуацию. Запущен экземпляр MyCoolProg, но юзер в данный момент печатает текст в MS Word. Потом берет - и из меню запускает вторую копию MyCoolProg. Теперь нам нужно из второй копии найти первую и поместить поверх всего, а вторую - закрыть. Окно первой копии будет заблокировано, так как по первым двум пунктам - оно не принадлежит foreground-process (вторая копия) и процесс первой копии не создан foreground-process-ом.


 
Anatoly Podgoretsky ©   (2007-06-21 20:43) [19]

> Инс  (21.06.2007 20:37:17)  [17]

Пока, пока, передумает - заходите в гости.


 
Инс   (2007-06-21 20:45) [20]


> Пока, пока, передумает - заходите в гости.


Я вообще-то про этот топик говорю. А насчет в гости... вы к нам тоже на delphikingdom чаще заглядывайте ;)


 
Anatoly Podgoretsky ©   (2007-06-21 20:47) [21]

> Инс  (21.06.2007 20:45:20)  [20]

Захожу иногда, пишу редко.


 
Инс   (2007-06-21 20:55) [22]

Вижу Вас иногда, по Вашим статьям с Indy знакомился ;)


 
Anatoly Podgoretsky ©   (2007-06-21 21:04) [23]

> Инс  (21.06.2007 20:55:22)  [22]

Я попробовал в свое время активно там работать - не понравилось. Основной недостаток сообщения не всплывают, а лазить по ним и смотреть не изменились ли нет желания. Это единственная причина. Сами вопросы ничем не отличаются от других форумов - даже пред модерирование не помогает.


 
Leonid Troyanovsky ©   (2007-06-21 21:38) [24]


> Инс   (21.06.07 20:43) [18]

> текст в MS Word. Потом берет - и из меню запускает вторую
> копию MyCoolProg. Теперь нам нужно из второй копии найти
> первую и поместить поверх всего, а вторую - закрыть. Окно
> первой копии будет заблокировано, так как по первым двум
> пунктам - оно не принадлежит foreground-process (вторая
> копия) и процесс первой копии не создан foreground-process-
> ом.

А не надо пытаться активировать вторую копию из non-foreground первой.
Вторая же - является таковой по закону, бо запущена by the foreground
process (Explorer), который, в свою очередь, был таковым благодаря
received the last input event (меню).

>умный не тот, кто много знает, а тот, кто умеет найти информацию и воспользоваться ей.

Изволь :)

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-06-21 21:51) [25]


> Инс   (21.06.07 20:37) [17]

> > Код нерабочий...

> спора, так как некоторые просто не хотят слушать собеседника,
>  проверять его аргументы

Ты привел код, ну и доказывай его работоспособность.
В качестве контраргумента я привел выдержку из msdn.
Очевидно, что первое противоречит второму.

Про выводы мне судить трудно, хотя, и доказательства
первого представляются мне весьма непростыми, особенно
в условиях  пренебрежения вторым.

--
Regards, LVT.


 
Инс   (2007-06-21 22:53) [26]


> А не надо пытаться активировать вторую копию из non-foreground
> первой.


Я вообще-то говорил наоборот - активировать первую из второй, а вторую - закрывать. Перечитайте мое сообщение [18] еще раз.


> Ты привел код, ну и доказывай его работоспособность.


Что ж, еще раз. Перевожу MSDN. Всплыть может только в одном из следующих случаев.
- Окно принадлежит foreground-процессу
- Окно принадлежит процессу, чей родитель foreground-процесс
- Процесс подключен к очереди ввода
- Нет foreground-процесса
- Foreground-процесс отлаживается
- Foreground-процесс не заблокирован с пом.  LockSetForegroundWindow
- Истек таймаут блокировки Foreground
Мой первый код выполняет условие из пункта, выделенного жирным. Что еще объяснить?


 
Инс   (2007-06-21 22:58) [27]

Хотя вот оно что! Если переводить буквально "процесс получил последним событие ввода", то это еще и объясняет трюк с SendInput. Теперь точно все понятно, по крайней мере для меня. Такое поведение документировано, а значит, ничего преступного в трюке нет.


 
DVM ©   (2007-06-21 22:59) [28]

Вот 100% рабочий код.


function ForceForegroundWindow(hWnd: HWND): BOOL;
const
 SPI_GETFOREGROUNDLOCKTIMEOUT = $2000;
 SPI_SETFOREGROUNDLOCKTIMEOUT = $2001;
var
 OsVerInfo: TOSVersionInfo;
 Win32MajorVersion: Integer;
 Win32MinorVersion: Integer;
 Win32Platform: Integer;
 ForegroundThreadID: DWORD;
 ThisThreadID: DWORD;
 Timeout: DWORD;
begin
 OsVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
 GetVersionEx(osVerInfo);
 Win32MajorVersion := OsVerInfo.dwMajorVersion;
 Win32MinorVersion := OsVerInfo.dwMinorVersion;
 Win32Platform := OsVerInfo.dwPlatformId;
 if IsIconic(hWnd) then ShowWindow(hWnd, SW_RESTORE);
 if GetForegroundWindow = hWnd then Result := True
 else
 begin
   if ((Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion > 4)) or
     ((Win32Platform = VER_PLATFORM_WIN32_WINDOWS) and ((Win32MajorVersion > 4)
       or ((Win32MajorVersion = 4) and (Win32MinorVersion > 0)))) then
   begin
     Result := False;
     ForegroundThreadID := GetWindowThreadProcessID(GetForegroundWindow, nil);
     ThisThreadID := GetWindowThreadPRocessId(hWnd, nil);
     if AttachThreadInput(ThisThreadID, ForegroundThreadID, True) then
     begin
       BringWindowToTop(hWnd);
       SetForegroundWindow(hWnd);
       AttachThreadInput(ThisThreadID, ForegroundThreadID, False);
       Result := (GetForegroundWindow = hWnd);
     end;
     if not Result then
     begin
       SystemParametersInfo(SPI_GETFOREGROUNDLOCKTIMEOUT, 0, @Timeout, 0);
       SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(0),
         SPIF_SENDCHANGE);
       BringWindowToTop(hWnd);
       SetForegroundWindow(hWnd);
       SystemParametersInfo(SPI_SETFOREGROUNDLOCKTIMEOUT, 0, TObject(Timeout),
                                                              SPIF_SENDCHANGE);
     end;
   end
   else
   begin
     BringWindowToTop(hWnd);
     SetForegroundWindow(hWnd);
   end;
   Result := (GetForegroundWindow = hWnd);
 end;
end; // End of function ForceForegroundWindow


Еще есть недокументированная функция SwitchToThisWindow(), которой пользуется сама MS.


 
Инс   (2007-06-21 23:05) [29]


> Основной недостаток сообщения не всплывают, а лазить по
> ним и смотреть не изменились ли нет желания.


Так есть же отслеживание по RSS. В прочем, Вы правы, сами вопросы ничем не отличаются, разве что откровенный мусор, благодаря предмодерации, все же на форум не попадает. Ну да ладно, не это главное. Подобные ресурсы любят за атмосферу, общение с близкими по духу людьми, да за многое!


 
Leonid Troyanovsky ©   (2007-06-21 23:26) [30]


> Инс   (21.06.07 22:53) [26]

> Я вообще-то говорил наоборот - активировать первую из второй,
>  а вторую - закрывать. Перечитайте мое сообщение [18] еще

Очевидно, что я читал его более внимательно, чем ты [24].
Активировать надо первую, а вторую - закрывать.
Тогда все получится в соответствии с условиями.
Тем более, что такого есть полезного у свежепущенной
копии, кроме, возможно, ее комстроки.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-06-21 23:35) [31]


> Инс   (21.06.07 22:58) [27]

> Хотя вот оно что! Если переводить буквально "процесс получил
> последним событие ввода", то это еще и объясняет трюк с

Пусть так, но уж никак не "Процесс подключен (?) к очереди ввода"

Только ничего это не объясняет, бо SI пошлет ввод foreground
процессу, а не вызывающему SFGW.

Есть на этом пути некое продолжение, но, рассказывать о нем я
не буду (почему аргументировал), могу лишь предложить
в качестве домашнего задания.
Но, в любом случае, оно должно оставаться академическим решением.

--
Regards, LVT.


 
Инс   (2007-06-21 23:35) [32]


> Очевидно, что я читал его более внимательно, чем ты [24].


Тогда чего вы пишите "А не надо пытаться активировать вторую копию из non-foreground первой." Я ничего про активирование второй из первой не писал! Вот только при активации первой из второй, как МЫ предлагаем, без дополнительных ухищрений, ни одно условие не соблюдается? Вы не согласны? Если не согласны, то какое соблюдается?


 
Инс   (2007-06-21 23:46) [33]

Да, с SendInput возможно погорячился... Что ж, останется пока загадкой. А насчет

> Пусть так, но уж никак не "Процесс подключен (?) к очереди
> ввода"


Я Вам Рихтера процитирую, ладно.

...Чтобы прекратить всю эту неразбериху, Microsoft сделала SetForegroundWindow чуть поумнее. В частности, эта функция срабатывает, только если вызывающий поток уже подключен к RIT или если поток, связанный с RIT R данный момент, не получал ввода на протяжении определенного периода (который задается функцией System ParametersInfo и значением SPI_SETFOREGROUNDLOCKTIMEOUT)

А от себя добавлю, что с помощью AttachThreadinput можно заставить два потока совместно использовать одну очередь ввода.


 
Leonid Troyanovsky ©   (2007-06-21 23:47) [34]


> DVM ©   (21.06.07 22:59) [28]

> Вот 100% рабочий код.

Любой сегодня работающий код на эту тему
уже завтра станет неработающим.

Давай порассуждаем. Предположим, что некто разработал
систему, основанную на правилах MS, а некий код пробивает
в оных брешь. После любого иска к MS (ведь захватом чужого
фокуса легко нанести этой системе вред) последние эту брешь
обязательно заткнут, бо такова политика. Скорее даже
это произойдет еще до иска, достаточно обсуждений в usenet :)

Да и нечего бороться с ветряными мельницами,
захват чужого фокуса и на самом деле отвратительнейшая вещь.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2007-06-21 23:56) [35]


> Инс   (21.06.07 23:35) [32]

> второй из первой не писал! Вот только при активации первой
> из второй, как МЫ предлагаем, без дополнительных ухищрений,
>  ни одно условие не соблюдается? Вы не согласны? Если не
> согласны, то какое соблюдается?

Ровно 3, считаем:

Вторая же - является таковой по закону, бо запущена by the foreground
process (Explorer) - раз

который, в свою очередь, был таковым благодаря
received the last input event (меню). - два

и три: запущенная проводником копия, являясь foreground,
может делать SFGW по первому пункту.

--
Regards, LVT.


 
Инс   (2007-06-21 23:57) [36]


> Давай порассуждаем. Предположим, что некто разработал
> систему, основанную на правилах MS, а некий код пробивает
> в оных брешь. После любого иска к MS (ведь захватом чужого
> фокуса легко нанести этой системе вред) последние эту брешь
> обязательно заткнут, бо такова политика.


Вот в этом фрагменте готов подписаться под каждым словом. Вот только трюк с AttachThreadInput ничему не противоречит, это вполне документированное поведение. Для меня это очевидно. Насчет трюка с SendInput я такого утверждать не могу, пока не разберусь, как это работает. Возможно это "фича", которую скоро заткнут. Нет плохих функций, есть плохие программы и плохие программисты, которые неправильно используют системные механизмы. Нужно править руки тех, кто пишет плохие программы, а не затыкать сомнительные дыры. Я приводил примеры, где эти трюки могут пойти во благо, но если ими злоупотреблять, то это разумеется вред.


 
Leonid Troyanovsky ©   (2007-06-22 00:05) [37]


> Инс   (21.06.07 23:46) [33]


> Я Вам Рихтера процитирую, ладно.

Да я с ним и не спорил :)

> А от себя добавлю, что с помощью AttachThreadinput можно
> заставить два потока совместно использовать одну очередь
> ввода.

Ну, хорошо, приаттачься своим потоком, скажем, к Блокноту
и заставь его OnKeyDown ;) на нажатие к-л клавиши в ем.

Можешь и в msdn заглянуть, ради любопытства.

--
Regards, LVT.


 
Инс   (2007-06-22 00:06) [38]


> Ровно 3, считаем:


Хм.. Что ж, тут посыпаю голову пеплом. В этой ситуации действительно отделаемся простым SetForegroundWindow. Но я ведь приводил еще два примера - будильник и ICQ. Комментируйте...


 
Anatoly Podgoretsky ©   (2007-06-22 00:11) [39]

> Инс  (22.06.2007 00:06:38)  [38]

Те мои пользователи, которые использую ICQ - отключили этот поплавок, поскольку работать не возможно, только начинаешь бить текст как он всплывает и уже дальше бьешь в нем.

Будильник, а кто сказал что он должен всплывать а не сигнализировать другим способом, для этого существует область оповещений и ballon hints, которые как раз и изобрели, что бы избежать проблем поплавка.

Пока ни один приведеный довод не убедил.


 
Leonid Troyanovsky ©   (2007-06-22 00:15) [40]


> Инс   (21.06.07 23:35) [32]

> копию из non-foreground первой." Я ничего про активирование
> второй из первой не писал!

Да, был невнимателен, sorry.
Т.е., описанный тобой (нами) путь вполне легален и не
требует никаких трюков. MS - гарантирует ;)

--
Regards, LVT.



Страницы: 1 2 вся ветка

Форум: "WinAPI";
Текущий архив: 2008.01.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.04 c
1-1192631833
Циркуль
2007-10-17 18:37
2008.01.20
Как должна работать удаленная отладка ?


15-1197746904
Kerk
2007-12-15 22:28
2008.01.20
Перевод слова "Geek"


2-1197962651
Бакук
2007-12-18 10:24
2008.01.20
DLL и поток


2-1198242627
new_user)
2007-12-21 16:10
2008.01.20
Сложение с плавающей точкой


15-1197647031
Kerk
2007-12-14 18:43
2008.01.20
Мотивация





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский