![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
notepad [D6]
mazepa © (2005-08-23 15:49:00)День добрый! а не подскажет ли кто как текст типа string передать в окно блокнота который notepad.exe (типа вывести отсчет в блокнот)
Leonid Troyanovsky (2005-08-23 17:40:00) [1]
> Zeqfreed © (23.08.05 17:27) [6]
> Я вижу только один случай, когда код не сработает - если
> блокнот не успеет окончательно загрузиться за ~100*50 мс.
> Есть ещё какие-то варианты?
А, еще вариант, что экземпляр блокнота, может
не совпасть со стартуемым.
--
Regards, LVT.
Leonid Troyanovsky (2005-08-23 17:38:00) [2]
> Zeqfreed © (23.08.05 17:27) [6]
> Я вижу только один случай, когда код не сработает - если
> блокнот не успеет окончательно загрузиться за ~100*50 мс.
> Есть ещё какие-то варианты?
WaitForInputIdle?
Т.е., когда стартуемый первичный поток приступит к обработке сообщений.
Но, это тоже - не панацея.
--
Regards, LVT.
Zeqfreed (2005-08-23 17:27:00) [3]Юрий Зотов © (23.08.05 17:11) [4]
> много лишнего
Согласен
> ненадежно
Я вижу только один случай, когда код не сработает - если блокнот не успеет окончательно загрузиться за ~100*50 мс. Есть ещё какие-то варианты?
> есть утечка ресурсов
Блин, точно. Вот что значит невнимательно читать справку :) Там и про WaitForInputIdle и про закрытие дескрипторов написано.
Все-таки небрежно я подхожу к написанию кода.. надо исправляться, пожалуй.
p.s. Спасибо за комментарии, Юрий.
Alexander Panov (2005-08-23 17:15:00) [4]mazepa (23.08.05 15:49)
Чтобы вопросы не оказывались в этой конференции, причем закрытыми, я бы все-таки рекомендовал оформлять тему вопроса как следует.
Юрий Зотов (2005-08-23 17:11:00) [5]> Zeqfreed © (23.08.05 16:39) [2]
ИМХО, ненадежно, много лишнего и есть утечка ресурсов.
Юрий Зотов (2005-08-23 16:44:00) [6]Хм... вопрос и правда несложный, но все же не сказал бы, что прям уж для начинающих... скорее, для 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;
Zeqfreed (2005-08-23 16:39:00) [7]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;
Моё видение сабжа :)
Leonid Troyanovsky (2005-08-23 16:16:00) [8]
> mazepa (23.08.05 15:49)
> День добрый! а не подскажет ли кто как текст типа string
> передать в окно блокнота который notepad.exe (типа вывести
> отсчет в блокнот)
Вывести это - запустить блокнот с открытым текстовым файлом:
uses
shellapi;
ShellExecute(Handle, 'open', 'notepad.exe', 'my.txt', nil, SW_SHOW);
А записать строку в запущенный блокнот - это другая песня.
--
Regards, LVT.