public const int WM_COMMAND = 273;
...
...
...
iHandle = GetWmpHandle();
wParam_set = (int)GetMenuItemId(iHandle, "&Правка", "Вст&авить CTRL+V");
IntPtr hEdit = FindWindowEx((IntPtr)iHandle, IntPtr.Zero, "Edit", "");
PostMessage((IntPtr)hEdit, WM_COMMAND, (IntPtr)wParam_set, IntPtr.Zero);
private System.Int32 GetWmpHandle()
{
// start with the top window on the Desktop
int window_handle = GetTopWindow(GetDesktopWindow());
StringBuilder text_stringBuilder = new StringBuilder(0x20);
String wmpText_string = "Безымянный — Блокнот";
StringBuilder class_stringBuilder = new StringBuilder(0x20);
String wmpClass_string = "Notepad";
bool b;
try
{
while (true)
{
// look at each Desktop window...
GetWindowText(window_handle,
text_stringBuilder, 0x20);
if (window_handle == 68240)
b = true;
if (text_stringBuilder.ToString().StartsWith(
wmpText_string))
{
// ...until you find one whose name starts
// with "Windows Media Player"
RealGetWindowClass(window_handle,
class_stringBuilder, 0x20);
if (class_stringBuilder.ToString().StartsWith(
wmpClass_string))
{
// ...and has a class name
// that starts with "WMPlayerApp"
return window_handle;
}
}
if ((window_handle = GetWindow(window_handle,
GW_HWNDNEXT)) == 0)
{
return 0;
}
}
}
catch (Exception e) { return 0; }
}
private System.UInt32 GetMenuItemId(int hWnd,
String menuItem_string, String submenuItem_string)
{
// get the main application menu
System.Int32 hMenu = GetMenu(hWnd);
int count = GetMenuItemCount(hMenu);
int menuItemIndex;
System.Text.StringBuilder menuItem =
new System.Text.StringBuilder(0x20);
menuItemIndex = -1;
for (int i = 0; i < count; i++)
{
// loop through main menu...
GetMenuString(hMenu, (uint)i, menuItem,
0x20, MF_BYPOSITION);
if (menuItem.ToString().StartsWith(menuItem_string))
{
menuItemIndex = i;
break;
}
}
if (menuItemIndex < 0) { return 0; }
hMenu = GetSubMenu(hMenu, menuItemIndex);
count = GetMenuItemCount(hMenu);
menuItemIndex = -1;
for (int i = 0; i < count; i++)
{
// loop through sub menu...
GetMenuString(hMenu, (uint)i,
menuItem, 0x20, MF_BYPOSITION);
if (menuItem.ToString().StartsWith(submenuItem_string))
{
menuItemIndex = i;
break;
}
}
if (menuItemIndex < 0) { return 0; }
return GetMenuItemID(hMenu, menuItemIndex);
}
Получить меню стороннего окна
Суть проблема такова.
Хочу получить меню сторонний программы и отправить команду на выполнения пункта меню.
При выполнении одного из пунктов меню появится TextBox и Button в TextBox нужно вбить автоматом нужные слова, ну а Button нажать.
Если подскажите в каком направлении читать, буду благодарен.
Рабочий код не прошу, конечно не откажусь если у кого-то есть что-то похожее, но вот направление в какую сторону копать очень хотелось бы понять.
Это для выполнения пункта меню.
Затем FindWindowEx (для поиска окна диалога и поиска на нём TextBox и Button). И наконец SetWindowText (для TextBox) и SendMessage (для Button).
А за
SendMessage(хендл_окна_программы, WM_COMMAND, номер_команды_меню, 0); прибольшущее спасибо. Сейчас буду ковырять
SetWindowText - про это я так вообще не был в курсе. =(
Спасибо. Погнла мучать программу.
Вроде как я нахожу номер пункта меню, но сообщение о нажатии на него ни как не идет.
Код ниже. Он находит все пункты меню и подменю.
В буфере обмена весит запись, которая вставляется при нажатии CTRL+V
Где мое не понимание зарылось?
Код:
PostMessage((IntPtr)iHandle, WM_COMMAND, ...
Цитата: Phodopus
PostMessage((IntPtr)iHandle, WM_COMMAND, ...
Конечно это я делал. Причем в первую очередь я так и написал.
Не работает!
Отловите Spy++ свойства окна и что приходит в него, пройдитесь дебаггером до параметров SendMessage().
Данный вам способ рабочий.
SPY++ смело виснит при переходе в MESSAGES. =(