Read contents - external listbox

Just starting out? Need help? Post your questions and find answers here.
User avatar
Otrebor
Enthusiast
Enthusiast
Posts: 199
Joined: Mon Mar 17, 2014 1:42 pm
Location: São Paulo, Brasil
Contact:

Read contents - external listbox

Post by Otrebor »

Hi

I'm using this code:

Code: Select all

HANDLE=FindWindow_(0,"EXTERNAL WINDOW")
GetWindowThreadProcessId_(HANDLE, @ProcID_)
hProc_ = OpenProcess_(#PROCESS_ALL_ACCESS, 0, ProcID_)
sBufferSize = 255
buffer.s=Space(sBufferSize)
*Result = VirtualAllocEx_(hProc_, 0, SizeOf(sBufferSize), #MEM_COMMIT, #PAGE_READWRITE)
listbox=$00090144 ; Got this with Spy++
Debug SendMessage_(listbox, #LB_GETTEXT, 1,*Result); this return -1
Debug ReadProcessMemory_(hProc_, *Result, buffer, sBufferSize, 0);this return 1
But it is not returning any string...

Thank's for any help!
User avatar
Sicro
Enthusiast
Enthusiast
Posts: 538
Joined: Wed Jun 25, 2014 5:25 pm
Location: Germany
Contact:

Re: Read contents - external listbox

Post by Sicro »

Image
Why OpenSource should have a license :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (syntax color scheme) :: RegEx-Engine (compiles RegExes to NFA/DFA)
Manjaro Xfce x64 (Main system) :: Windows 10 Home (VirtualBox) :: Newest PureBasic version
User avatar
Otrebor
Enthusiast
Enthusiast
Posts: 199
Joined: Mon Mar 17, 2014 1:42 pm
Location: São Paulo, Brasil
Contact:

Re: Read contents - external listbox

Post by Otrebor »

Hi

Unfortunately seems that your code is specific to Listview (perhaps i'm wrong?).
Thank you.
User avatar
Otrebor
Enthusiast
Enthusiast
Posts: 199
Joined: Mon Mar 17, 2014 1:42 pm
Location: São Paulo, Brasil
Contact:

Re: Read contents - external listbox

Post by Otrebor »

What mean after a API - SendMessage_() return -1 ?
User avatar
Otrebor
Enthusiast
Enthusiast
Posts: 199
Joined: Mon Mar 17, 2014 1:42 pm
Location: São Paulo, Brasil
Contact:

Re: Read contents - external listbox

Post by Otrebor »

Hi

Someone can help me to adapt this code?
Is this possible?
https://forums.embarcadero.com/thread.j ... dID=117805

Code: Select all

#include <Oleacc.h>
#include <utilcls.h>
 
...
 
CoInitialize(0);
 
...
 
TComInterface<IAccessible> Acc;
AccessibleObjectFromWindow(listview, OBJID_WINDOW, IID_IAccessible, (void**)&Acc);
if (Acc)
{
    long count = 0;
    Acc->get_accChildCount(&count);
 
    for (long i = 0; i < count; ++i)
    {
        WideString wText;
        if (SUCCEEDED(Acc->get_accName(TVariant(i+1), &wText)))
        {
            // use wText as needed...
        }
    }
}
else
{
    // the LB_GETTEXT approach ...
}
 
...
 
CoUninitialize();

Code: Select all

Prototype ProtoAccessibleObjectFromWindow(hwnd.i,dwObjectID.l, riid, *ppvObject)
Global AccessibleObjectFromWindow.ProtoAccessibleObjectFromWindow
hdll=OpenLibrary(#PB_Any,"Oleacc.dll")

AccessibleObjectFromWindow = GetFunction(hdll,"AccessibleObjectFromWindow")
AccessibleObjectFromWindow(listbox, 0, riid, *ppvObject)
User avatar
Sicro
Enthusiast
Enthusiast
Posts: 538
Joined: Wed Jun 25, 2014 5:25 pm
Location: Germany
Contact:

Re: Read contents - external listbox

Post by Sicro »

Yes, sorry, the code is only for listview gadgets (ListIconGadget, not ListViewGadget, in PureBasic).

I try to find a solution at the weekend, if no one else has a solution before.
Image
Why OpenSource should have a license :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (syntax color scheme) :: RegEx-Engine (compiles RegExes to NFA/DFA)
Manjaro Xfce x64 (Main system) :: Windows 10 Home (VirtualBox) :: Newest PureBasic version
User avatar
Otrebor
Enthusiast
Enthusiast
Posts: 199
Joined: Mon Mar 17, 2014 1:42 pm
Location: São Paulo, Brasil
Contact:

Re: Read contents - external listbox

Post by Otrebor »

No problem, Sicro :wink:

I'm doing a lot of experiences with part of original code by Luis.

Code: Select all

;port by luis
;http://www.purebasic.fr/english/viewtopic.php?f=17&t=51303
;PB 4.61

;EnableExplicit



Macro DEFINE_GUID(Name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
  CompilerIf Defined(Name, #PB_Variable)
  If SizeOf(Name) = SizeOf(GUID)
    Name\Data1    = l
    Name\Data2    = w1
    Name\Data3    = w2
    Name\Data4[0] = b1
    Name\Data4[1] = b2
    Name\Data4[2] = b3
    Name\Data4[3] = b4
    Name\Data4[4] = b5
    Name\Data4[5] = b6
    Name\Data4[6] = b7
    Name\Data4[7] = b8
  EndIf
  CompilerEndIf
EndMacro

Global IID_IAccessible.GUID
DEFINE_GUID(IID_IAccessible, $618736e0, $3c3d, $11cf, $81, $0c, $00, $aa, $00, $38, $9b, $71)
;DEFINE_GUID(IID_IAccessible, $00020404, $0000, $0000, $c0, $00, $00, $00, $00, $00, $00, $46)


Prototype.l ProtoAccessibleObjectFromWindow(hwnd.i,dwObjectID.l, riid, *ppvObject)
Global AccessibleObjectFromWindow.ProtoAccessibleObjectFromWindow

Prototype.l ProtoAccessibleChildren(*paccContainer,iChildStart.l,cChildren.l,*rgvarChildren,*pcObtained)
Global AccessibleChildren.ProtoAccessibleChildren

Define hdll
Define *Accessible.IAccessible

CoInitialize_(0)

hdll=OpenLibrary(#PB_Any,"Oleacc.dll")

AccessibleObjectFromWindow = GetFunction(hdll,"AccessibleObjectFromWindow")
 


Procedure DisplayInfo (*aAccessible.IAccessible, aOffset$ )
 Protected count, iObtained
 Protected BSTR_wsText
 Protected vt.VARIANT, i, err
 Protected *enum.IEnumVARIANT
 
 vt\vt = #VT_I4
 vt\lVal = 0
 
 If *aAccessible
   BSTR_wsText = SysAllocString_("")  
   ;*BSTR_wsText=AllocateMemory(1024)
    If *aAccessible\get_accChildCount(@count) = #S_OK And count > 0     
      For i = 0 To count  
        If *aAccessible\get_accName(vt+i, @BSTR_wsText) = #S_OK
          Debug PeekS(@BSTR_wsText,-1,#PB_Ascii)
        EndIf
      Next
    EndIf 
 EndIf
EndProcedure


listbox = $000402DE
#OBJID_WINDOW=0
#OBJID_CLIENT=$FFFFFFFC


If listbox      
    If AccessibleObjectFromWindow(listbox, #OBJID_WINDOW, @IID_IAccessible, @*Accessible) = #S_OK     
        DisplayInfo(*Accessible, "")
    EndIf
EndIf
Still not working...
User avatar
Sicro
Enthusiast
Enthusiast
Posts: 538
Joined: Wed Jun 25, 2014 5:25 pm
Location: Germany
Contact:

Re: Read contents - external listbox

Post by Sicro »

Code: Select all

Procedure$ GetItemTextFromListBox(ListBoxHandle, ItemIndex)
  Protected CountOfCharacters
  Protected Retval$
  
  ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761315(v=vs.85).aspx
  CountOfCharacters = SendMessage_(ListBoxHandle, #LB_GETTEXTLEN, ItemIndex, 0)
  
  If CountOfCharacters <> #LB_ERR
    Retval$ = Space(CountOfCharacters)
    
    ; https://msdn.microsoft.com/en-us/library/windows/desktop/bb761313(v=vs.85).aspx
    SendMessage_(ListBoxHandle, #LB_GETTEXT, ItemIndex, @Retval$)
  EndIf
  
  ProcedureReturn Retval$
EndProcedure

Define i

For i = 0 To 5
  Debug GetItemTextFromListBox($000601D6, i)
Next
Image
Why OpenSource should have a license :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (syntax color scheme) :: RegEx-Engine (compiles RegExes to NFA/DFA)
Manjaro Xfce x64 (Main system) :: Windows 10 Home (VirtualBox) :: Newest PureBasic version
Post Reply