是否有發送API來訪問另一個應用程序中的菜單命令?例如,我試圖訪問記事本的視圖菜單。我該怎麼做?我已經使用GetSystemMenu獲得菜單,但我無法訪問它。我認爲這已經有API,但我不知道。什麼是從外部應用程序訪問菜單命令的發送API
2
A
回答
3
Python中的以下代碼激活View/Status Bar菜單項。無論如何,將它轉換爲Delphi應該沒有問題,因爲它看起來像僞代碼。它跨越(「View」)和第一個項目(「狀態欄」)選擇第四個菜單項。如果您想要,可以通過遍歷項目並使用GetMenuString
來更改它以通過文本搜索所需的項目。有關詳細信息,請參閱MSDN。
請注意,它不會執行任何錯誤檢查。還要注意,它預計記事本的標題是'無標題 - 記事本'。 (你可以改變,要None
搜索什麼,我想這將是德爾福nil
)
from win32gui import *
from win32con import *
hwnd = FindWindow('Notepad', 'Untitled - Notepad') # use Winspector Spy to find window class name and title
hmenu = GetMenu(hwnd)
hviewmenu = GetSubMenu(hmenu, 3) # 3rd menu item across, starting from 0
id = GetMenuItemID(hviewmenu, 0) # 0th menu item down ("Status Bar")
PostMessage(hwnd, WM_COMMAND, id, 0)
2
這裏一些Delphi代碼。
請注意,如果您沒有真正的菜單,則這不起作用。
來自幫助: 「GetMenu無法在浮動菜單欄上工作,浮動菜單欄是模仿標準菜單的自定義控件,它們不是菜單,要使用浮動菜單欄上的句柄,請使用Active Accessibility API。
例如,它不會與德爾福自身工作...
// Grab sub menu for a Window (by handle), given by (0 based) indices in menu hierarchy
function GetASubmenu(const hW: HWND; const MenuInts: array of Integer): HMENU;
var
hSubMenu: HMENU;
I: Integer;
begin
Result := 0;
if Length(MenuInts) = 0 then
Exit;
hSubMenu := GetMenu(hW);
if not IsMenu(hSubMenu) then
Exit;
for I in MenuInts do
begin
Assert(I < GetMenuItemCount(hSubMenu), format('GetASubmenu: tried %d out of %d items',[I, GetMenuItemCount(hSubMenu)]));
hSubMenu := GetSubMenu(hSubMenu, I);
if not IsMenu(hSubMenu) then
Exit;
end;
Result := hSubMenu;
end;
// Get the caption for MenuItem ID
function GetMenuItemCaption(const hSubMenu: HMENU; const Id: Integer): string;
var
MenuItemInfo: TMenuItemInfo;
begin
MenuItemInfo.cbSize := 44; // Required for Windows 95. not sizeof(AMenuInfo)
MenuItemInfo.fMask := MIIM_STRING;
// to get the menu caption, 1023 first chars should be enough
SetLength(Result, 1023 + 1);
MenuItemInfo.dwTypeData := PChar(Result);
MenuItemInfo.cch := Length(Result)-1;
if not GetMenuItemInfo(hSubMenu, Id, False, MenuItemInfo) then
RaiseLastOSError;
// real caption's size. Should call GetMenuItemInfo again if was too short
SetLength(Result, MenuItemInfo.cch);
{$WARN SYMBOL_PLATFORM OFF}
if DebugHook > 0 then
OutputDebugString(MenuItemInfo.dwTypeData);
end;
procedure Test;
var
hwnd, hSubMenu: Cardinal;
id : Integer;
begin
// hwnd := FindWindow('Afx:00400000:8:00010013:00000000:03F61829', nil); // UltraEdit
// hSubMenu := GetASubmenu(hwnd, [5,0]);
hwnd := FindWindow('Notepad', nil); // get the 1st instance of Notepad...
hSubMenu := GetASubmenu(hwnd, [3]); // 4th submenu Menu aka &View
if hSubMenu > 0 then
begin
id := GetMenuItemID(hSubMenu, 0); // 1st Item in that sub menu (must not be a submenu itself)
if id > -1 then
begin
PostMessage(hwnd, WM_COMMAND, id, 0);
ShowMessage('Done: ' + GetMenuItemCaption(hSubMenu, id));
end
else
RaiseLastOSError;
end
else
RaiseLastOSError;
end;
相關問題
- 1. 在外部應用程序執行上下文菜單命令
- 2. 從外部Java應用程序發送打開的Minecraft中的命令
- 3. 如何在bash中向外部程序發送外部命令?
- 4. 從外部應用程序訪問ProcessMaker BPM框架的API
- 5. 無法訪問從外部命令行啓動的dockerized應用程序
- 6. VBA發送API調用外部程序
- 7. 從外部應用程序訪問Shopify API
- 8. instagram api應用程序訪問令牌
- 9. 如何在AppleScript中發送菜單欄應用程序(不含菜單欄菜單項)命令?
- 10. 內部部署的外部應用程序,它們是什麼?
- 11. 從外部應用程序Shopify API? (backbone.js)
- 12. 從asp.net應用程序中從框API獲取訪問令牌?
- 13. Android應用程序+全驅動器訪問的Drive API ...程序是什麼?
- 14. 從C程序發送Linux命令
- 15. 如何從GUI應用程序向控制檯應用程序發送命令
- 16. 從Linux下的Mono-GTK#應用程序訪問「應用程序菜單」
- 17. 發送echo命令到外部xTerm
- 18. 是否可以從外部網絡發送Cordova exec命令給cordova應用程序?
- 19. 從java執行外部命令/應用程序
- 20. 發佈應用程序後無法訪問命令行
- 21. 從外部程序訪問Plinqo元數據的策略是什麼?
- 22. 使用外部應用程序訪問HTML表單域
- 23. 從服務器發送命令到android應用程序
- 24. 從c#發送命令到java應用程序#
- 25. 將命令從Excel發送到應用程序? COM?
- 26. 從Android應用程序發送SD命令
- 27. 從Android應用程序無線發送鍵盤命令到Mac
- 28. 訪問從Java的Mac OS X應用程序菜單
- 29. Objective-C:從外部應用程序獲取菜單信息
- 30. 從Web應用程序訪問Google API