Hi Developers! > And just one question: can i add a new menu item using plugin API or > not?
Yes of course! :) I have successfully added menu into TB! Look at attachment. Here is my example code: [...] std::vector<std::string> sLabels; void TBP_EXPORT TBP_Initialize() { //search TB main window: BOOL rc = EnumWindows( // hDesk, // handle to desktop to enumerate (WNDENUMPROC)EnumWindowsProc, // points to application's callback function (LPARAM)&hMainWindow // 32-bit value to pass to the callback function ); HMENU hMenu = GetMenu(hMainWindow); hMyMenu = CreateMenu(); sLabels.push_back("MenuItem 1"); sLabels.push_back("MenuItem 2"); sLabels.push_back("MenuItem 3"); BuildMenu(hMyMenu); //add menu : rc = AppendMenu( hMenu, MF_POPUP, // menu-item flags (UINT)hMyMenu, // menu-item identifier or handle of drop-down menu or submenu "TB-Plugin" // menu-item content ); //replace original window proc #ifdef STRICT lpPrevMainWndProc = (WNDPROC)SetWindowLong(hMainWindow, GWL_WNDPROC, (LONG)MainWindowProc); #else lpPrevMainWndProc = (FARPROC)SetWindowLong(hMainWindow, GWL_WNDPROC, (LONG)MainWindowProc); #endif if(lpPrevMainWndProc) MessageBox(NULL, "OK", "OK", MB_OK); //debug msg } //EnumChildProcedure BOOL CALLBACK EnumWindowsProc( HWND hwnd, // handle to child window LPARAM lParam // application-defined value ) { HWND *hMailer = (HWND*)lParam; TCHAR ClassName[256]; LPTSTR lpClassName = ClassName; int Ret = GetClassName(hwnd, // handle of window lpClassName, // address of buffer for class name 256 // size of buffer, in characters ); if(strncmp(ClassName, "TMailerForm", 256) == 0) { *hMailer = hwnd; return FALSE; } return TRUE; } void BuildMenu(HMENU hMenu) { MENUITEMINFO mii; ZeroMemory(&mii, sizeof(MENUITEMINFO)); mii.cbSize = sizeof(MENUITEMINFO); for(int i=0; i<sLabels.size(); i++) { mii.fMask = MIIM_STRING | MIIM_ID; TCHAR* pLabel = new TCHAR[sLabels[i].size()+1]; ZeroMemory(pLabel, sLabels[i].size()+1); CopyMemory(pLabel, sLabels[i].c_str(), sLabels[i].size()+1); mii.cch = sLabels[i].size(); mii.dwTypeData = pLabel; mii.wID = 500 + i; InsertMenuItem( hMenu, GetMenuItemCount(hMenu), TRUE, &mii ); delete [] pLabel; } } //my Main Window Proc to replace original LRESULT CALLBACK MainWindowProc( HWND hwnd, // handle of window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { LRESULT result; UINT wNotifyCode; // notification code UINT wID; // item, control, or accelerator identifier HWND hwndCtl; // handle of control AnsiString Msg; int File; switch (uMsg) { case WM_COMMAND: wNotifyCode = HIWORD(wParam); // notification code wID = LOWORD(wParam); // item, control, or accelerator identifier hwndCtl = (HWND) lParam; // handle of control switch(wID) { case 500: MessageBox(NULL, "MenuItem 1", "TB-Plugin", MB_OK); break; case 501: MessageBox(NULL, "MenuItem 2", "TB-Plugin", MB_OK); break; case 502: MessageBox(NULL, "MenuItem 3", "TB-Plugin", MB_OK); break; } break; } //call original proc: return CallWindowProc(lpPrevMainWndProc, hwnd, uMsg, wParam, lParam); } [...] -- Best regards, Jacek Szumigaj The Bat! 3.0.2.10/Windows XP 5.1
TBMenuPlugin.png
Description: PNG image
________________________________________________ http://www.silverstones.com/thebat/TBUDLInfo.html