Текущий архив: 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