home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.visual.basic      MS Visual Basic discussions, NOT dot-net      10,840 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 10,696 of 10,840   
   Don to Bill@localhost.com   
   Re: Get Control IDs more efficiently   
   07 Dec 08 16:33:04   
   
   XPost: microsoft.public.vb.general.discussion, microsoft.public.vb   
   From: dsarvas@yahoo.com   
      
   The program I wrote monitors all windows running at a users   
   workstation, frequently testing those windows for text boxes, list   
   boxes, etc. for a specific string of characters that might contain   
   names of clients.  Any number of programs might be run at the user's   
   workstation that might contain such info.  If that string is found, my   
   program reacts by searching our own databases, documents, etc. for all   
   info pertaining to that client as an alert to the user of specific   
   procedures that must not be missed should they forget to check   
   themselves.   
      
   It works, but using the windows handle for each window found by   
   enumerating through the windows using EnumWindowProc() and   
   EnumChildProc() I still need to loop through each of those windows to   
   find the ID of the text boxes, etc. using the following code which   
   will find the text I'm searching in the variable strWindowsText below:   
      
   For lngCtrlId = 1 to 100   
       lngCtrlHWND = GetDlgItem(hWnd, lngCtrlId)   
       strWindowText = String(80, Chr(0))   
       SendMessage lngCtrlHWND, WM_GETTEXT, 100, ByVal strWindowText   
   Next lngCtrlId   
      
   As an example, if you open Notepad and type "Test" in Notepad's edit   
   screen, my program will find the string "Text" since I already know   
   that the ID of Notepad's edit screen is 15.  But if I didn't know the   
   ID is 15, I would need to loop through all possible values until I   
   reached 15 and my program would then find the text.  But an ID can be   
   as high as the maximum number for the ID data type, and to run a loop   
   to such a high number for all windows running may cause enough of a   
   delay to be ineffective.   
      
   I've already tried using GetDlgID() as you and others suggested, but   
   using the Notepad example, it doesn't seem to return a value of 15 as   
   the ID for the Notepad edit screen.   
      
   I'm going on the assumption I'm missing something here so I still plan   
   to play around with these suggestions.  Maybe I'm just not using these   
   functions properly or perhaps the method I've been using is the only   
   way?   
      
   Ideally, I would like to get a list of all control IDs from all   
   windows and then use the ID and the hwnd values to grab the text from   
   each using SendMessage.   
      
   Don   
   On Sun, 7 Dec 2008 14:14:33 +1100, "Bill McCarthy"   
    wrote:   
      
   >Hi Don,   
   >   
   >As others have said, use GetDlgCtrlID :   
   >   
   >Public Declare Function GetDlgCtrlID Lib "user32" Alias "GetDlgCtrlID"   
   >(ByVal hwnd As Long) As Long   
   >   
   >Loop through the child windows, get the hwnd then call GetDlgCtrlID  using   
   >the control's hwnd.   
   >   
   >Just out of curiosity, why do you want the control ID's ?   
   >   
   >   
   >"Don"  wrote in message   
   >news:493a9d6d.2039234@news.west.cox.net...   
   >> Thanks.  That's what I've been doing all along to get all windows,   
   >> child windows and so on as deeply nested as necessary.  But to get the   
   >> IDs of all the text boxes, etc. on each window required that I run a   
   >> loop to test all possible ID numbers in existence.  Looks like the way   
   >> I've been doing it is the best I can hope for, then.  Unfortunately,   
   >> if I use a loop of 0 to 100, for instance, I won't find an control ID   
   >> with a very high number.  If I run a loop with a very high limit then   
   >> it may take longer than I want . . . but works.   
   >>   
   >> Don   
   >>   
   >> On Sat, 6 Dec 2008 16:21:42 +1100, "Bill McCarthy"   
   >>  wrote:   
   >>   
   >>>Hi Don,   
   >>>   
   >>>You use those same functions to recurse children of children.  You won't   
   >>>get   
   >>>all controls, such as labels; only those that have windows.   
   >>>   
   >>>   
   >>>"Don"  wrote in message   
   >>>news:49394812.3110859@news.west.cox.net...   
   >>>> Regarding the two suggestions offered so far, I see I wasn't clear in   
   >>>> my original post..   
   >>>>   
   >>>> I'm using EnumWindows and EnumChildWindows to get all the window   
   >>>> handles and their IDs which works fine.  But it's all the controls   
   >>>> inside each window for which I need their IDs (text boxes, command   
   >>>> buttons, etc.).  Creating a loop to test all possible ID numbers does   
   >>>> work, but it would be much better if there an equivalent of the   
   >>>> EnumWindows function that also enumerates all the control IDs inside   
   >>>> the window.   
   >>>>   
   >>>> Don   
   >>>>   
   >>>> On Thu, 04 Dec 2008 21:07:40 GMT, dsarvas@yahoo.com (Don) wrote:   
   >>>>   
   >>>>>I'm using the GetDlgItem function to get the text from a specific   
   >>>>>control in external apps.  Works fine, but if I don't know the control   
   >>>>>ID, I create a loop (e.g. 0 to 100) to test all the control IDs in   
   >>>>>that range to find the control.  Problem is that a control can have a   
   >>>>>very large number as the ID and I enumerate through all windows and   
   >>>>>their child windows so that can create a little more delay than I want   
   >>>>>and I would never be sure my loop is a range that covers the highest   
   >>>>>control ID number.   
   >>>>>   
   >>>>>Is there an API function or a way to grab all the control ID numbers   
   >>>>>on a window rather than looping through a range of numbers to find a   
   >>>>>control that matches that ID number?   
   >>>>>   
   >>>>>Thanks,   
   >>>>>Don   
   >>>>   
   >>>   
   >>   
   >   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca