Тема: AHK: Отправка сообщения через Skype
Подскажите, пожалуйста, возможно ли отправить сообщение через Skype определенному пользователю? И предоставьте, пожалуйста, решение этой головоломки.
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите, пожалуйста, возможно ли отправить сообщение через Skype определенному пользователю? И предоставьте, пожалуйста, решение этой головоломки.
SkypeName := "XXXXXX" While WinExist("ahk_class TConversationForm") WinClose, ahk_class TConversationForm run, skype:%SkypeName%?chat WinWait, ahk_class TConversationForm ControlSend, TChatRichEdit1, Привет{enter}, ahk_class TConversationForm
Думаю, что есть недостатки:
run, skype: - у меня где то 3-7 секунд запускает.
TChatRichEdit1 - индекс контрола может менятся во время работы.
ControlSend - `n может запустить отправку, нет многострочности.
Привет{enter} - не у всех это отошлёт сообщение, у меня например enter назначен в скайпе на перенос строки.
- у меня ни разу не отправило.
Так вроде работает:
#SingleInstance Force
#Persistent
#NoEnv
#UseHook
DllCall("LoadLibrary","Str","oleacc","Ptr")
ContactName = Name ; оригинальное имя контакта, может отличатся от отображаемого в списке
1::
Message = My Message`n%A_TickCount%`n-----------
WinExist("ahk_class tSkMainForm ahk_exe Skype.exe")
ControlGet, hList, Hwnd,, TConversationsControl1
Acc := Acc__NeedChildren(Acc__ObjectFromWindow(hList), 2)
Loop % Acc.accChildCount - 1
If InStr(Acc.accName(A_Index + 1), "`, " ContactName "`,")
{
Acc.accSelect(3, A_Index + 1)
ControlSend, , {Enter}, ahk_id %hList%
WinActivate
WinWaitActive, , , 1
If ErrorLevel
Break
WinGet, Controls, ControlList
RegExMatch(Controls, ".*TChatEntryControl(\d+)", m)
ControlSetText, % "TChatRichEdit" m1, %Message%
ControlSend, % "TChatEntryControl" m1, {enter}
Break
}
Return
Acc__NeedChildren(Acc, Index) {
if DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int",0, "Int", Index, "Ptr",VarSetCapacity(varChildren, Index*(8+2*A_PtrSize),0)*0+&varChildren, "Int*", Index)=0 {
Loop %Index%
i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren, i), Obj := (NumGet(varChildren,i-8)=9 ? ComObj(9,ComObjQuery(child, "{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) : child), NumGet(varChildren,i-8)=9 ? ObjRelease(child) : 0
Return Obj
}
}
Acc__ObjectFromWindow(hWnd, idObject = 0) {
If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
Return ComObjEnwrap(9,pacc,1)
}
run, skype: - у меня где то 3-7 секунд запускает.
У меня постоянно: 1.2 секунды
TChatRichEdit1 - индекс контрола может менятся во время работы.
Не знал, я у себя только один видел.
ControlSend - `n может запустить отправку, нет многострочности.
Твой вариант с ControlSetText лучше, но Send {Enter} в конце кода может быть послано не в окно скайпа. Почему не использовать:
ControlSend, TChatRichEdit1, {enter}^{enter}
В твоем коде у меня показывает и цикл прекращается:
msgbox % clipboard := Acc.accName(A_Index + 1)
Все последние сообщения., 6 новых
Скайп: 6.21
Скайп: 6.21
Ого, а уменя 7.7.0.103.
Думаю остальные вопросы не актуальны. Со скайпом так всегда, для каждой версии свои костыли.
ап: обновил сейчас до 7.8.0.102, тоже работает.
ControlSend, TChatRichEdit1, {enter}^{enter}
А это работает, упростил код.
А вот так отсылает даже при свёрнутом окне:
#SingleInstance Force
#Persistent
#NoEnv
#UseHook
DllCall("LoadLibrary","Str","oleacc","Ptr")
ContactName = Name ; оригинальное имя контакта, может отличатся от отображаемого в списке
1::
Message = My Message`n%A_TickCount%`n-----------
WinExist("ahk_class tSkMainForm ahk_exe Skype.exe")
ControlGet, hList, Hwnd,, TConversationsControl1
Acc := Acc__NeedChildren(Acc__ObjectFromWindow(hList), 2)
Loop % Acc.accChildCount - 1
If InStr(Acc.accName(A_Index + 1), "`, " ContactName "`,")
{
Acc.accSelect(3, A_Index + 1)
ControlSend, , {Down}{Up}, ahk_id %hList%
Acc.accSelect(3, A_Index + 1)
WinGet, Controls, ControlList
RegExMatch(Controls, ".*TChatRichEdit(\d+)", m)
ControlSetText, % "TChatRichEdit" m1, %Message%
ControlSend, % "TChatRichEdit" m1, {LCtrl Down}{Enter}{LCtrl Up}
Break
}
Return
Acc__NeedChildren(Acc, Index) {
if DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int",0, "Int", Index, "Ptr",VarSetCapacity(varChildren, Index*(8+2*A_PtrSize),0)*0+&varChildren, "Int*", Index)=0 {
Loop %Index%
i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren, i), Obj := (NumGet(varChildren,i-8)=9 ? ComObj(9,ComObjQuery(child, "{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) : child), NumGet(varChildren,i-8)=9 ? ObjRelease(child) : 0
Return Obj
}
}
Acc__ObjectFromWindow(hWnd, idObject = 0) {
If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
Return ComObjEnwrap(9,pacc,1)
}
Я лично сделал по-простецкому и без наворотов...
activeSkype := true
SkypeName := "example.example"
sendMsg() {
IfWinExist, Skype
run, skype:%SkypeName%?chat
While (activeSkype) {
IfWinActive, Skype™ -
{
activeSkype := false
SendInput, Тут текст.{Enter}
SetTimer, activeSkypeOn, 5000
}
Sleep, 3000
}
}
activeSkypeOn:
SetTimer, activeSkypeOn, Off
activeSkype := true
return
MoZg а у вас какая версия скайп?
7.7.64.103
У вас
run, skype:%SkypeName%?chat
сразу запускает, или с задержкой?
С задержкой...
А код из 7 поста пробовали?
Вы конечно пользуйтесь чем удобнее, мне просто интересно у других оно работает или нет.
Нет, не пробовал.
Что бы я добавил в код 7.
1) Чтобы отправлять сообщения в закрытый скайп:
DetectHiddenWindows, On
2) Перед проверкой имен в скайпе вписать:
PostMessage, 0x111, 172, 0, , ahk_class tSkMainForm ; Переключение с вкладки "последние" на "контакты"
(Кроме как через PostMessage послать переключение этих вкладок у меня никакне получилось).
3) В описании уточнить, что в скайпе должен быть активирован стандартный режим просмотра.
4) Если скайп не запущен, то запускать его.
В шестой версии все работает, только надо заменить
Acc := Acc__NeedChildren(Acc__ObjectFromWindow(hList), 2)
на:
Acc := Acc__NeedChildren(Acc__ObjectFromWindow(hList), 3)
Что то я первые 3 пункта не понял:
Как понять закрытый скайп?
Переключение с вкладки "последние" на "контакты" у меня это сообщение ничего не делает.
Что за стандартный режим просмотра?
У тебя теперь последняя версия?
Нет, у меня шестая версия (седьмую ставить не хочу - графика не нравится).
Для седьмой наверное надо посылать другое сообщение для переключения вкладок.
Закрытый скайп - я имею в виду когда его окно спрятано (нажат крестик).
Что за стандартный режим просмотра?
Закрытый скайп - я имею в виду когда его окно спрятано (нажат крестик).
В 7 если нажать крест, то просто сворачивается.
Для седьмой наверное надо посылать другое сообщение для переключения вкладок.
А то где было взято.
https://support.skype.com/ru/faq/FA1010 … okna-skype
Только не "стандартный режим просмотра", а "Отображение в одном окне", но примечание конечно не помешает, если этот скрипт кому то вообще нужен. Можно конечно и "компактный режим просмотра" учесть, но в нём кажется не получится отправлять в фоне.
А то где было взято.
А то я взял через WinSpector.
Есть такое сообщение, но оно иногда активирует окно.
SendMessage, 0x0000bd04, 0x00000031, 0x20020001
У меня все время активирует.
А откуда ты эти параметры взял?
Наверное стоит перед посылом проверять какая вкладка активна, например так:
Acc := Acc__NeedChildren(Acc__ObjectFromWindow(hList), 2)
if (Acc.accName(1) != "Весь список контактов")
SendMessage, 0x0000bd04, 0x00000031, 0x20020001
Тоже WinSpector ом, а то для 6 версии тоже все время активирует?
Наверное стоит перед посылом проверять какая вкладка активна, например так:
Это понятно, просто смысл, если активация всё же возможна.
А объектная модель уже не поддерживается? Раньше такое на vbs работало:
With CreateObject("Skype4COM.Skype", "Skype_")
If Not .Client.IsRunning Then .Client.Start
.SendMessage "SkypeName", "Hello!"
End With
Перестала поддерживаться, по-моему после версии 6.16.
Ясно. Хотя я всё равно старыми версиями предпочитаю пользоваться, когда требуется.
Поддерживается, только урезали (в частности посылание сообщений).
https://support.skype.com/en/faq/FA214/ … esktop-api
SendMessage, 0x0000bd04, 0x00000031, 0x20020001
А как ты эти значения получил через WinSpector, можешь ликбез дать?
Для шестой версии эти параметры sendmessage вкладку переключают, но в то же самое время постоянно активируют (restore) скайп, поэтому я и предложил проверять состояние вкладки.
Для шестой версии эти параметры sendmessage вкладку переключают, но в то же самое время постоянно активируют (restore) скайп
Так я и спросил твоё прежнее сообщение
PostMessage, 0x111, 172, 0
активирует?
поэтому я и предложил проверять состояние вкладки.
Но если вкладка не та, то придётся активировать. С активным окном всегда много вариантов, а надо без активации.
А как ты эти значения получил через WinSpector, можешь ликбез дать?
Я тебя сначала хотел спросить, ты же сам получил старое сообщение через WinSpector.
В скайпе нажал Alt+1, посмотрел какое сообщение после нажатия 1 произошло.
PostMessage, 0x111, 172, 0 - да активирует.
А какие фильтры оставляешь для отлавливания сообщений посыла клавиш?
Да как то не заморачивался, просто скрыл особо назойливые.
Кстати у тебя версия какая? У меня 1.0b Build 37. Не могу найти где актуальную версию посмотреть, а то сильно глючит.
Поддерживается, только урезали (в частности посылание сообщений).
https://support.skype.com/en/faq/FA214/ … esktop-api
Не нашёл там ничего про поддержку объектной модели. Как она теперь работает?
Так не активирует:
#SingleInstance Force
#Persistent
#NoEnv
#UseHook
DllCall("LoadLibrary","Str","oleacc","Ptr")
ContactName = Name ; оригинальное имя контакта, может отличатся от отображаемого в списке
1::
Message = My Message`n%A_TickCount%`n-----------
WinExist("ahk_class tSkMainForm ahk_exe Skype.exe")
ControlGet, hList, Hwnd,, TConversationsControl1
AccList := Acc__ObjectFromWindow(hList)
Acc := Acc__NeedChildren(AccList, 1)
If Acc.accRole(1) = 30
Acc.accDoDefaultAction(1)
Acc := Acc__NeedChildren(AccList, 2)
Loop % Acc.accChildCount - 1
If InStr(Acc.accName(A_Index + 1), "`, " ContactName "`,")
{
Acc.accSelect(3, A_Index + 1)
ControlSend, , {Down}{Up}, ahk_id %hList%
Acc.accSelect(3, A_Index + 1)
WinGet, Controls, ControlList
RegExMatch(Controls, ".*TChatRichEdit(\d+)", m)
ControlSetText, % "TChatRichEdit" m1, %Message%
ControlSend, % "TChatRichEdit" m1, {LCtrl Down}{Enter}{LCtrl Up}
Break
}
Return
Acc__NeedChildren(Acc, Index) {
if DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int",0, "Int", Index, "Ptr",VarSetCapacity(varChildren, Index*(8+2*A_PtrSize),0)*0+&varChildren, "Int*", Index)=0 {
Loop %Index%
i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren, i), Obj := (NumGet(varChildren,i-8)=9 ? ComObj(9,ComObjQuery(child, "{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) : child), NumGet(varChildren,i-8)=9 ? ObjRelease(child) : 0
Return Obj
}
}
Acc__ObjectFromWindow(hWnd, idObject = 0) {
If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
Return ComObjEnwrap(9,pacc,1)
}
Не нашёл там ничего про поддержку объектной модели. Как она теперь работает?
Не знаю как, я ей никогда не пользовался.
Но админ пишет, что работает:
http://community.skype.com/t5/Windows-d … -p/3822770
Кстати у тебя версия какая? У меня 1.0b Build 37
Такая же и тоже подглючивает.
serzh82saratov, круто!
Может добавь запуск скайпа, если он не запущен и запости в коллекцию?
А то вещь некоторым очень нужная.
Ну такой костыль в коллекции точно не нужен, а оно и в 6 работает?
Интерфейс больно капризный, тут очень много всего ещё не учтено из всех вариантов того что может быть в окне, возможно лучше автоматизировать через web.
Но админ пишет, что работает
Работает для какой версии?
The API call events work now again with the very latest Skype 7.1 version, which was released just yesterday.
http://www.skype.com/en/download-skype/
At least in my case (http://community.skype.com/t5/Windows-desktop-client/SKYPE4COM-CallStatus-event-no-longer-working/m-...), everything works now as it should in this Skype 7.1.0.105 version.
http://community.skype.com/t5/Windows-d … 912/page/3
Ну такой костыль в коллекции точно не нужен, а оно и в 6 работает?
Интерфейс больно капризный, возможно лучше автоматизировать через web.
Через Web, предполагаю, могут забанить айпишник.
В шестом немного другие пути, а так все тоже самое (defaultaction на вкладках только нету)
Я еще добавил нажатие на крестик если активирован поиск пользователей:
#SingleInstance Force
#Persistent
#NoEnv
#UseHook
DllCall("LoadLibrary","Str","oleacc","Ptr")
ContactName = test ; оригинальное имя контакта, может отличатся от отображаемого в списке
1::
Message = My Message`n%A_TickCount%`n-----------
WinExist("ahk_class tSkMainForm ahk_exe Skype.exe")
ControlGet, hList, Hwnd,, TConversationsControl1
AccList := Acc__ObjectFromWindow(hList)
Acc := Acc__NeedChildren(AccList, 2)
if (Acc.accRole(1) = "")
{
PressToolBarButton(hList, 2)
Acc := Acc__NeedChildren(AccList, 2)
}
If Acc.accRole(1) = 37 && !Acc.accSelect(3, 1)
ControlSend, , {Enter}, ahk_id %hList%
Acc := Acc__NeedChildren(AccList, 3)
Loop % Acc.accChildCount - 1
If InStr(Acc.accName(A_Index + 1), "`, " ContactName "`,")
{
Acc.accSelect(3, A_Index + 1)
ControlSend, , {Down}{Up}, ahk_id %hList%
Acc.accSelect(3, A_Index + 1)
WinGet, Controls, ControlList
RegExMatch(Controls, ".*TChatRichEdit(\d+)", m)
ControlSetText, % "TChatRichEdit" m1, %Message%
ControlSend, % "TChatRichEdit" m1, {Enter}
Break
}
Return
Acc__NeedChildren(Acc, Index) {
if DllCall("oleacc\AccessibleChildren", "Ptr", ComObjValue(Acc), "Int",0, "Int", Index, "Ptr",VarSetCapacity(varChildren, Index*(8+2*A_PtrSize),0)*0+&varChildren, "Int*", Index)=0 {
Loop %Index%
i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren, i), Obj := (NumGet(varChildren,i-8)=9 ? ComObj(9,ComObjQuery(child, "{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1) : child), NumGet(varChildren,i-8)=9 ? ObjRelease(child) : 0
Return Obj
}
}
Acc__ObjectFromWindow(hWnd, idObject = 0) {
If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
Return ComObjEnwrap(9,pacc,1)
}
PressToolBarButton(hwnd, ButtonID)
{
AccObj := Acc__ObjectFromWindow(hwnd, OBJID_CLIENT := 0xFFFFFFFC)
if !IsObject(AccObj) {
MsgBox, Не удалось получить AccObj
Return
}
AccObj.accDoDefaultAction(ButtonID)
}
The API call events work now again with the very latest Skype 7.1 version
The very latest Skype version is 7.7.
Ну тут уже надо пробовать.
А ты тестировал?
У меня при попытке создать объект
MsgBox, % IsObject(ComObjCreate("Skype4COM.Skype", "Skype_"))
выдаёт ошибку
Error: 0x800401F3 - Недопустимая строка с указанием класса
Если запустить такой код:
DllCall("LoadLibrary", Str, "C:\Program Files (x86)\Common Files\Skype\Skype4COM.dll")
MsgBox, % A_LastError
выдаёт ошибку 193
ERROR_BAD_EXE_FORMAT
193 (0xC1)
%1 is not a valid Win32 application.
У меня A_LastError = 1411.
Такой код у меня, меня пытается активировать окно, кнопка в панели задач начинает моргать, звонка не происходит.
oSkype := ComObjCreate("Skype4COM.Skype")
oSkype.PlaceCall("echo123")
Может тут что полезное - http://devdelphi.ru/?p=2963.
Не, это вообще про версию 1.0
А так что выдаёт?
MsgBox, % IsObject(ComObjCreate("Skype4COM.Skype", "Skype_"))
А так что выдаёт?
Как и у тебя.
Да это полезно - http://devdelphi.ru/?p=1045
Теперь звонит, причём моментально!!!
oSkype := ComObjCreate("Skype4COM.Skype")
oSkype.PlaceCall("echo123")
Хм, у меня после нажатия "Контроль доступа других программ к Skype" появляется пустое окно с неактивными кнопками:
У меня при попытке создать объект
Похоже, сейчас без второго параметра нужно либо "Skype4COM.Skype.1".
Скачал библиотеку, зарегил. Проблем с отправкой нет.
Нет, у меня всё равно объект не создаётся.
х32 запускай.
Да, на x32 создался.
До кучи вот описание - http://users.skynet.be/fa258239/bestand … pe4com.pdf.
Вот примеры скриптов - https://www.autoitscript.com/forum/topi … pe4comlib/, что успел проверить, всё работает.
serzh82saratov
Вторую ссылку видел. А вот первая не качает. Переложил бы кто.
Add: Ладно, уже не надо. Забрал с Архива.
Примерно так должно работать:
ContactName =
1::
oSkype := ComObjCreate("Skype4COM.Skype")
oSkypeConnect := ComObjConnect(oSkype, "Skype_")
If !oSkype.Client.IsRunning
oSkype.Client.Start()
oMembers := ComObjCreate("Skype4COM.UserCollection")
oMembers.Add(oSkype.User(ContactName))
oChat := oSkype.CreateChatMultiple(oMembers)
oChat.OpenWindow ; показать окно, необязательно
oMsg := oChat.SendMessage("Greetings!")
oChat.Leave
MsgBox Leave
Skype_AttachmentStatus(aStatus) {
Global oSkype
MsgBox % oSkype.Convert.AttachmentStatusToText(aStatus)
If (aStatus = oSkype.Convert.TextToAttachmentStatus("AVAILABLE"))
oSkype.Attach()
}
Return
но не судьба теперь отправить так сообщения - https://support.skype.com/ru/faq/FA1238 … ut-na-nego. На 6 версии наверное должно.
У нас тут уже давно это было - http://forum.script-coding.com/viewtopic.php?id=6113. В принципе на 6 ещё проще должно быть:
oSkype := ComObjCreate("Skype4COM.Skype")
oMembers := ComObjCreate("Skype4COM.UserCollection")
oMembers.Add(oSkype.User(ContactName))
oChat := oSkype.CreateChatMultiple(oMembers)
oChat.OpenWindow ; показать окно, необязательно
oMsg := oChat.SendMessage("Greetings!")
Да, на шестой отправляет сообщение.
Только как на 64 бит автохотки создавать 32 бит объекты?
Думаю никак, со ScriptControl например нет решений.
В шапку таких скриптов, чтобы не создавть ярлыков, можно добавлять подобное:
If (!A_IsCompiled && A_PtrSize = 8) {
Run, % SubStr(A_AhkPath, 1, InStr(A_AhkPath, "\", 0, 0)) "AutoHotkeyU32.exe " A_ScriptFullPath
ExitApp
}
Кстати данная ситуация в дополнение к ответу на твой вопрос.
Если не смущает активация окна, в 7 версии можно так:
ContactName =
oSkype := ComObjCreate("Skype4COM.Skype")
1::
oSkype.Client.OpenMessageDialog(ContactName, "Message")
Send, {LCtrl Down}{Enter}{LCtrl Up}
Return
Лучше так:
ContactName =
1::
If !oSkype
oSkype := ComObjCreate("Skype4COM.Skype")
If !oSkype.Client.IsRunning
oSkype.Client.Start()
While !oSkype.Client.IsRunning
Sleep 10
oSkype.Client.OpenContactsTab()
oSkype.Client.OpenMessageDialog(ContactName, "")
WinExist("ahk_class tSkMainForm ahk_exe Skype.exe")
WinGet, Controls, ControlList
RegExMatch(Controls, ".*TChatRichEdit(\d+)", m)
ControlSetText, % "TChatRichEdit" m1, Message
ControlSend, % "TChatRichEdit" m1, {LCtrl Down}{Enter}{LCtrl Up}
Return
После
oSkype.Client.OpenMessageDialog(ContactName, "")
у меня диалог открывается в новом окне TConversationForm, так что дальнейший код не работает.
Наверное компактный режим просмотра, тогда 1 вариант.
Видимо справка PDF не полная, CreateChatWith в ней нет, очень коротко получается.
oSkype := ComObjCreate("Skype4COM.Skype")
oChat := oSkype.CreateChatWith(ContactName)
oChat.SendMessage("Greetings!")
oChat.OpenWindow
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться