Delphi: Программно закрыть и сохранить notepad.exe

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by lamer811, 28 Sep 2011.

  1. lamer811

    lamer811 Elder - Старейшина

    Joined:
    8 Nov 2009
    Messages:
    130
    Likes Received:
    39
    Reputations:
    12
    Помогите программно закрыть и сохранить содержимое 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:

    Не прокатило...
     
    #1 lamer811, 28 Sep 2011
    Last edited by a moderator: 30 Sep 2011
  2. NekitoSP

    NekitoSP New Member

    Joined:
    14 May 2010
    Messages:
    17
    Likes Received:
    0
    Reputations:
    0
    а опускать кнопку кто будет?!
     
  3. lamer811

    lamer811 Elder - Старейшина

    Joined:
    8 Nov 2009
    Messages:
    130
    Likes Received:
    39
    Reputations:
    12
    Нету разницы, все равно не работает
     
  4. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    ты меня завел,я долго парился(очень долго т.к. гребаный блокнот не имеет названия меню и все 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
    фуууууух вроде все.
     
  5. lamer811

    lamer811 Elder - Старейшина

    Joined:
    8 Nov 2009
    Messages:
    130
    Likes Received:
    39
    Reputations:
    12
    А у меня снова ничего не вышло...

    А может ли это зависеть от версии винды?
    На просторах интернета есть люди, которые убеждают, что можно сохранить, так, как делаю я.

    Вот кстати на ачате даже писали:
    http://forum.antichat.ru/printthread.php?t=39636&page=307&pp=10
     
  6. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    Врядли.я проверял на разных виндах.мы ж работаем с приложением.что не получается конкретно?запи*** код частями в условия и проверяй что выполняется,а что нет...
     
  7. Ha_Vi

    Ha_Vi Elder - Старейшина

    Joined:
    19 Aug 2008
    Messages:
    17
    Likes Received:
    22
    Reputations:
    0
    Я хоть и не кодер, но через cmd в XP создается и соханяется -
     
  8. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Просто так нельзя это сделать, надо чтобы окно было активным.
    Пример:
    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;
    
     
  9. DooD

    DooD Elder - Старейшина

    Joined:
    30 Sep 2010
    Messages:
    1,168
    Likes Received:
    450
    Reputations:
    288
    да эмуляцией нажатия клавиш тоже можно,но оно подойдет только для тех подпунктов которые имеют горячие клавиши,да и код вроде более громоздкий.
     
  10. shadowrun

    shadowrun Banned

    Joined:
    29 Aug 2010
    Messages:
    842
    Likes Received:
    170
    Reputations:
    84
    SendMessage( FindWindow('Notepad', nil), WM_CLOSE, 0, 0);