Invoking menu of other applications

Started by
0 comments, last by nprz 18 years, 7 months ago
I'm trying to open menu of other applications programmatically, sending the messages a window receives when I click the menu items or when I press ALT+F then 'O' to open a file, for example. I've tried with: CWnd * pWnd= the window I want to control (I read the handle with Spy++ then I use CWnd::FromHandle); CMenu * pMenu=pWnd->GetMenu(); CMenu * pSubMenu=pMenu->GetSubMenu(0); // 0 correspond to "File" menu int MenuID=pSubMenu->GetMenuItemID(5); // 5 correspond to "Save as..." item pWnd->SendMessage(WM_COMMAND,MenuID,NULL); While this can work for Notepad, for other application it doesn't work (eg. with an instance of Visual C++). I searched on google and yesterday I found a source in VB that make use of CommandBar objects to invoke menu and I promised myself to give it a try (after installing the .NET 2003 Toolkit I've not downloaded yet [grin]). (I think it is easier to write a program like that with VB instead of VC++.) Can you suggest a link or a tutorial on using CommandBar and/or invoking menu of another application since I cannot find the VB source code I found yesterday? Any other suggestion (ie. open source project, other methods, etc.) will be surely helpful. Thank you very much in advance. :)
Fil (il genio)
Advertisement
A long time ago I wrote a function to do this for VB6 (I have no idea how to program for VB.NET).

You need to declare all the necessary functions.
You need to pass the hWnd number.
I always used findwindow(), which you only need the class name string or title string, but whichever method you wish to use is fine.

I couldn't run menus for Windows Explorer, but it worked for other basic programs.
Sub RunMenuByString(Application As Long, StringSearch As String)    tosearch& = GetMenu(Application)    menucount& = GetMenuItemCount(tosearch&)        For findstring& = 0 To menucount& - 1        tosearchsub& = GetSubMenu(tosearch&, findstring&)        menuitemcount& = GetMenuItemCount(tosearchsub&)                For GetString& = 0 To menuitemcount& - 1            subcount& = GetMenuItemID(tosearchsub&, GetString&)            menustring$ = String(100, " ")            getstringmenu& = GetMenuString(tosearchsub&, subcount&, menustring$, 100, 1)                        If InStr(UCase(menustring$), UCase(StringSearch)) Then                MenuItem& = subcount&                GoTo MatchString            End If                Next GetString&            Next findstring&    Exit SubMatchString:    RunTheMenu& = PostMessage(Application, WM_COMMAND, MenuItem&, 0&)End Sub

This topic is closed to new replies.

Advertisement