万一博客上的一上例子,除了取记事本内容。转回来,加上了一句偌,增加了设置记事本内容。 procedure TForm1.Button1Click(Sender: TObject); var h: HWND; p: Pointer; Len: Integer; a : array [0..3] of Char; s : string; i : Integer; begin h := FindWindow('Notepad', nil); //用EnumWindows行不行呢? if h = 0 then Exit; h := GetWindow(h, GW_CHILD);//用EnumChildWindows行不行呢?改天试试,应该可以 if h = 0 then Exit; Len := SendMessage(h, WM_GETTEXTLENGTH, 0, 0) + 1; //先取字符长度 p := GlobalAllocPtr(0, Len * SizeOf(Char)); //分配内存 SendMessage(h, WM_GETTEXT, Len, Cardinal(p)); //发消息,取字符 ShowMessage(PChar(p)); GlobalFreePtr(p); for i := 0 to 3 do begin a[i] := 'b'; end; s := '我'; StrpCopy(@a,s); //这句运行完后,数组a中的四个元素成了:#206 #210 #0 b。因为delphi中#0是字符串结束标志,而C++中用/0表示字符串结束。 SendMessage(h,WM_SETTEXT,0,Cardinal(@a)); //设置记事本中的字符 end; 另:用EnumWindows实现查找窗口也实现了,代码如下: unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) btnDoEnum: TButton; procedure btnDoEnumClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} {先写回调函数,给EnumWindows用的。} function doenumWindowProc(myhandle : HWND; lpara: LPARAM): Boolean; stdcall; var TextLen : Integer; arStr : array [0..255] of AnsiChar; s : string; begin //TextLen := SendMessage(myhandle,WM_GETTEXTLENGTH,0,0); GetWindowText(myhandle,arStr,7); //查找窗口的字符,这里要找的是"计算器"三个字,共6个ansichar但要多留一个char放结束字符 // RealGetWindowClass(myhandle,arclass,256); s := StrPas(arstr); if Pos('计算器',s) <> 0 then begin //ShowMessage('finded'); //只显示一个message框不直观 SendMessage(myhandle,WM_CLOSE,0,0);//找到这个窗口了,发个消息把它关了,这样更直观 Result := True; Exit; end else begin Result := True; Exit; end; end; procedure TForm1.btnDoEnumClick(Sender: TObject); begin EnumWindows(@doenumWindowProc,0); end;