Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.02;
Скачать: CL | DM;

Вниз

notepad   Найти похожие ветки 

 
mazepa   (2005-08-23 15:49) [0]

День добрый! а не подскажет ли кто как текст типа string передать в окно блокнота который notepad.exe (типа вывести отсчет в блокнот)


 
Leonid Troyanovsky ©   (2005-08-23 16:16) [1]


> mazepa   (23.08.05 15:49)  
> День добрый! а не подскажет ли кто как текст типа string
> передать в окно блокнота который notepad.exe (типа вывести
> отсчет в блокнот)


Вывести это - запустить блокнот с открытым текстовым файлом:

uses
 shellapi;

 ShellExecute(Handle, "open", "notepad.exe", "my.txt", nil, SW_SHOW);

А записать строку в запущенный блокнот - это другая песня.

--
Regards, LVT.


 
Zeqfreed ©   (2005-08-23 16:39) [2]

mazepa   (23.08.05 15:49)
function RunNotepad() : boolean;
var
pi : TProcessInformation;
si : TStartUpInfo;
buf : array[0..MAX_PATH - 1] of Char;
begin
ZeroMemory(@pi, SizeOf(TProcessInformation));
ZeroMemory(@si, SizeOf(TStartUpInfo));
si.wShowWindow := SW_SHOW;
si.dwFlags := STARTF_USESHOWWINDOW;

GetWindowsDirectory(buf, MAX_PATH);
Result := (CreateProcess(PChar(buf + "\notepad.exe"), nil, nil, nil, false, 0, 0, nil, si, pi) <> FALSE);
end;

procedure WriteToNotepad(const Str : String; const ShowNotepad : boolean = true);
var
text :  PChar;
wndNotepad, wndEdit : HWND;
buf : array[0..MAX_PATH - 1] of Char;
t : Integer;
begin
text := PChar(str);

wndNotepad := FindWindow("Notepad", nil);

if (wndNotepad = 0) then begin
 t := 0;
 if RunNotepad then
  repeat
   Sleep(50);
   Application.ProcessMessages;
   wndNotepad := FindWindow("Notepad", nil);
   Inc(t);
  until (t > 100) or (wndNotepad <> 0);
end;

if (wndNotepad <> 0) then begin
 wndEdit := FindWindowEx(wndNotepad, 0, "Edit", nil);

 if (wndEdit <> 0) then begin
  SendMessage(wndEdit, WM_SETTEXT, 0, Integer(@text[0]));
  if ShowNotepad then SetForegroundWindow(wndNotepad);
 end;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
WriteToNotepad("Hello, world!");
end;


Моё видение сабжа :)


 
Юрий Зотов ©   (2005-08-23 16:44) [3]

Хм... вопрос и правда несложный, но все же не сказал бы, что прям уж для начинающих... скорее, для WinAPI... если, конечно, передавать текст напрямую, как сказано, а не через файл.

В общем, вот запуск блокнота с передачей текста из Memo прямо в его окно.


function EnumThreadWndProc(Wnd: HWND; Addr: PHandle): BOOL; stdcall;
begin
 Result := False;
 Addr^ := Wnd
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 StartupInfo: TStartupInfo;
 ProcessInfo: TProcessInformation;
 Wnd: HWND;
begin
 ZeroMemory(@StartupInfo, SizeOf(StartupInfo));
 StartupInfo.cb := SizeOf(StartupInfo);
 if Win32Check(CreateProcess(nil, "Notepad.exe", nil, nil, False, 0, nil, nil, StartupInfo, ProcessInfo)) then
 begin
   if Memo1.Text <> "" then
   begin
     WaitForInputIdle(ProcessInfo.hProcess, INFINITE);
     EnumThreadWindows(ProcessInfo.dwThreadId, @EnumThreadWndProc, Integer(@Wnd));
     SendMessage(GetWindow(Wnd, GW_CHILD), WM_SETTEXT, 0, Integer(@Memo1.Text[1]))
   end;
   CloseHandle(ProcessInfo.hThread);
   CloseHandle(ProcessInfo.hProcess)
 end;
end;


 
Юрий Зотов ©   (2005-08-23 17:11) [4]

> Zeqfreed ©   (23.08.05 16:39) [2]

ИМХО, ненадежно, много лишнего и есть утечка ресурсов.


 
Alexander Panov ©   (2005-08-23 17:15) [5]

mazepa   (23.08.05 15:49)
Чтобы вопросы не оказывались в этой конференции, причем закрытыми, я бы все-таки рекомендовал оформлять тему вопроса как следует.


 
Zeqfreed ©   (2005-08-23 17:27) [6]

Юрий Зотов ©   (23.08.05 17:11) [4]

> много лишнего

Согласен


> ненадежно

Я вижу только один случай, когда код не сработает - если блокнот не успеет окончательно загрузиться за ~100*50 мс. Есть ещё какие-то варианты?


> есть утечка ресурсов

Блин, точно. Вот что значит невнимательно читать справку :) Там и про WaitForInputIdle и про закрытие дескрипторов написано.

Все-таки небрежно я подхожу к написанию кода.. надо исправляться, пожалуй.

p.s. Спасибо за комментарии, Юрий.


 
Leonid Troyanovsky ©   (2005-08-23 17:38) [7]


> Zeqfreed ©   (23.08.05 17:27) [6]

> Я вижу только один случай, когда код не сработает - если
> блокнот не успеет окончательно загрузиться за ~100*50 мс.
> Есть ещё какие-то варианты?


WaitForInputIdle?
Т.е., когда стартуемый первичный поток приступит к обработке сообщений.
Но, это тоже - не панацея.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-08-23 17:40) [8]


> Zeqfreed ©   (23.08.05 17:27) [6]

> Я вижу только один случай, когда код не сработает - если
> блокнот не успеет окончательно загрузиться за ~100*50 мс.
> Есть ещё какие-то варианты?


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

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2005.10.02;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.028 c
2-1124454491
Пантелеев Иван
2005-08-19 16:28
2005.10.02
Длина в Edit


14-1126111597
Zacho
2005-09-07 20:46
2005.10.02
Посоветуйте, что почитать из космоопер ?


1-1126379116
Grol
2005-09-10 23:05
2005.10.02
Поставить окно приложения на передний план


1-1126346249
kblc
2005-09-10 13:57
2005.10.02
Методы com


1-1126704034
Maverick
2005-09-14 17:20
2005.10.02
Получить из массива байт строку с HEX-текстом