1 (изменено: Zanoza, 2014-03-07 17:26:53)

Тема: AHK: Извлечь текст из чата Skype

Помогите пожалуйста, никак не получается извлечь  текст чата  со скайпа.
Пробовал вариант с WinGetText в окне
http://s6.hostingkartinok.com/uploads/images/2014/03/4069d7f44c8c4ed4efb88bfa1708f4c5.png
Но получил только
http://s6.hostingkartinok.com/uploads/images/2014/03/6ed9ab20a28b16a811b9963af3dfa14b.png
Я хотел сделать OSD информацию после поступления нового сообщения  в чате (когда появляются новые сообщения), но увы не получается.
Помогите пожалуйста !

Win10 x64

2

Re: AHK: Извлечь текст из чата Skype

Если я правильно понял то нужно что б новое сообщение открывалось в табличке? Идея хорошая, но в скайпе есть же функция на подобии tooltip уведомление в трей приходит.

3

Re: AHK: Извлечь текст из чата Skype

Zanoza, текст из чата скайпа теоретически получить можно, если надо ещё, могу посмотреть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Извлечь текст из чата Skype

teadrinker пишет:

Zanoza, текст из чата скайпа теоретически получить можно, если надо ещё, могу посмотреть.

Да надо, пожалуйста если не трудно подскажите!

Win10 x64

5

Re: AHK: Извлечь текст из чата Skype

У меня так работает:

ChatArray := GetChatArray()
/*
; Сообщения просматривать так:
for k, v in ChatArray
   MsgBox, % v
*/

MsgBox, % ChatArray[ChatArray.MaxIndex()]  ; последнее сообщение чата
return

GetChatArray()
{
   if !(hwnd := WinExist("ahk_class TConversationForm"))
      ErrorExit("Окно чата не найдено")

   if !IsObject(AccSkype := Acc_ObjectFromWindow(hwnd))
      ErrorExit("Не удалось получить IAccessible из окна чата")
      
   if !IsObject(AccChat := GetAccChat(AccSkype))
      ErrorExit("Не удалось получить сообщения")

   Array := []
   for k, v in Acc_Children(AccChat)
      Array[A_Index] := v.accName(0)
   Return Array
}

GetAccChat(AccObj)
{
   if (AccObj.accName(0) = "Содержимое чата")
      Return AccObj
   
   for k, v in Acc_Children(AccObj)
      if IsObject(obj := GetAccChat(v))
         Return obj
}

ErrorExit(message)
{
   MsgBox, % message
   ExitApp
}

Acc_Init()
{
   Static   h
   If Not   h
      h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}

Acc_ObjectFromWindow(hWnd, idObject = 0)
{
   Acc_Init()
   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)
}

Acc_WindowFromObject(pacc)
{
   If   DllCall("oleacc\WindowFromAccessibleObject", "Ptr", IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0
   Return   hWnd
}

Acc_GetRoleText(nRole)
{
   nSize := DllCall("oleacc\GetRoleText", "Uint", nRole, "Ptr", 0, "Uint", 0)
   VarSetCapacity(sRole, (A_IsUnicode?2:1)*nSize)
   DllCall("oleacc\GetRoleText", "Uint", nRole, "str", sRole, "Uint", nSize+1)
   Return   sRole
}

Acc_GetStateText(nState)
{
   nSize := DllCall("oleacc\GetStateText", "Uint", nState, "Ptr", 0, "Uint", 0)
   VarSetCapacity(sState, (A_IsUnicode?2:1)*nSize)
   DllCall("oleacc\GetStateText", "Uint", nState, "str", sState, "Uint", nSize+1)
   Return   sState
}

; Written by jethrow
Acc_Role(Acc, ChildId=0) {
   try return ComObjType(Acc,"Name")="IAccessible"?Acc_GetRoleText(Acc.accRole(ChildId)):"invalid object"
}
Acc_State(Acc, ChildId=0) {
   try return ComObjType(Acc,"Name")="IAccessible"?Acc_GetStateText(Acc.accState(ChildId)):"invalid object"
}
Acc_Location(Acc, ChildId=0, byref Position="") { ; adapted from Sean's code
   try Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)
   catch
      return
   Position := "x" NumGet(x,0,"int") " y" NumGet(y,0,"int") " w" NumGet(w,0,"int") " h" NumGet(h,0,"int")
   return   {x:NumGet(x,0,"int"), y:NumGet(y,0,"int"), w:NumGet(w,0,"int"), h:NumGet(h,0,"int")}
}
Acc_Parent(Acc) { 
   try parent:=Acc.accParent
   return parent?Acc_Query(parent):
}
Acc_Child(Acc, ChildId=0) {
   try child:=Acc.accChild(ChildId)
   return child?Acc_Query(child):
}
Acc_Query(Acc) { ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
   try return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}
Acc_Error(p="") {
   static setting:=0
   return p=""?setting:setting:=p
}
Acc_Children(Acc) {
   if ComObjType(Acc,"Name") != "IAccessible"
      ErrorLevel := "Invalid IAccessible Object"
   else {
      Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]
      if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren,cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0 {
         Loop %cChildren%
            i:=(A_Index-1)*(A_PtrSize*2+8)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child):
         return Children.MaxIndex()?Children:
      } else
         ErrorLevel := "AccessibleChildren DllCall Failed"
   }
   if Acc_Error()
      throw Exception(ErrorLevel,-1)
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Извлечь текст из чата Skype

Огромное спасибо, то что нужно!

Win10 x64