Помогите программно закрыть и сохранить содержимое notepad.exe Я это делаю так: Code: PostMessage(findwindowex(wnd, findwindow(nil,'Сохранить'), nil, nil), wm_quit,0,0); Исходя из кода, который просто закрывает блокнот: Code: PostMessage(wnd, wm_quit, 0, 0); wnd это сам блокнот: Code: wnd := FindWindow('notepad', nil); Попробовал нажать комбинацию CTRL + S: Не прокатило...
ты меня завел,я долго парился(очень долго т.к. гребаный блокнот не имеет названия меню и все spy ++ и т.п. не помогли)и я решил,и приобрел новые знания,а делается уася так: находишь окно блокнота через wnd:=findwindow('notepad',nil); фокусируешь его windows.setforegroundwindow(wnd); получаешь меню блокнота ебучего(ой извините,извините)men:=getmenu(wnd); получаешь подпункты меню getsubmenu(men,0);второй параметр означает индекс меню(0-это 1).затем получаешь ID нужного подпункта меню i:integer; i:=getmenuitemid(men2,2) {men2:hmenu} и наконец посылаешь postmes с параметром WM_COMMAND postmessage(wnd,WM_COMMAND,i,0); ну а дальше легко,в появившемся диалоговом окне находишь класс edit пишешь туда что угодно и посылаешь enter через keybd_event фуууууух вроде все.
А у меня снова ничего не вышло... А может ли это зависеть от версии винды? На просторах интернета есть люди, которые убеждают, что можно сохранить, так, как делаю я. Вот кстати на ачате даже писали: http://forum.antichat.ru/printthread.php?t=39636&page=307&pp=10
Врядли.я проверял на разных виндах.мы ж работаем с приложением.что не получается конкретно?запи*** код частями в условия и проверяй что выполняется,а что нет...
Просто так нельзя это сделать, надо чтобы окно было активным. Пример: Code: var MainWnd : THandle; OldWnd : THandle; begin MainWnd := FindWindow('Notepad', nil); if MainWnd <> 0 then begin OldWnd := GetForegroundWindow(); SetForegroundWindow(MainWnd); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0); keybd_event(Ord('S'), MapVirtualKey(Ord('S'), 0), 0, 0); keybd_event(Ord('S'), MapVirtualKey(Ord('S'), 0), KEYEVENTF_KEYUP, 0); keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0); SetForegroundWindow(OldWnd); SendMessage(MainWnd, WM_CLOSE, 0, 0); end; end;
да эмуляцией нажатия клавиш тоже можно,но оно подойдет только для тех подпунктов которые имеют горячие клавиши,да и код вроде более громоздкий.