用Delphi创建一个应用程序,包含一个Memo和2个Button,如何实现......(200分)

  • 主题发起人 主题发起人 djw
  • 开始时间 开始时间
D

djw

Unregistered / Unconfirmed
GUEST, unregistred user!
用Delphi创建一个应用程序,包含一个Memo和2个Button,如何实现:<br>当单击Button1时,<br>自动把Memo的内容复制到一个打开的记事本中或其他打开窗口Memo或Text中。<br>当单击Button2时,<br>执行打开的记事本程序中或其他打开窗口的快捷键(如:Ctrl+s或Ctrl+Alt+a等)。
 
在Delphi的安装光盘中有一个sndkey32.pas文件,用它可以实现你的要求。<br>(Path: Info/Extras/SendKeys/)<br><br>begin<br>&nbsp; Memo1.CopyToClipboard;<br>&nbsp; AppActivate('未定标题 - 记事本'); //关键是这一步,要知道窗体的标题<br>&nbsp; SendKeys('^v',false); //Ctrl+v<br>&nbsp; SendKeys('abcABC ?!',false);<br>&nbsp; SendKeys('^s',false); //Ctrl+s<br>&nbsp; SendKeys('abc.txt',false); //在对话框中输入文件名<br>&nbsp; SendKeys('{ENTER}',false); //回车<br>&nbsp; ...<br>end;<br><br>至于如何取得窗体的标题,大富翁里有很多贴子,查一下就可以了。<br>
 
creation-zy:<br><br>不管用啊!
 
关于Button1的问题,很简单,只要不是IE中的Edit就用SendMessage()就可以了。<br>关于Button2,我想可以用Keybd_event?
 
djw:<br>&nbsp; 怎么可能?<br>&nbsp; 你是否已经通过Click Button1激活了记事本? 这一步是最关键的,我是在Win2K下打开记事本,<br>新建了一个文件——此时记事本的标题就成了'未定标题 - 记事本'。不知道你试验的时候记事本<br>的标题是什么——一点都不能错的!<br>&nbsp; 你再将SendKeys('abcABC ?!',false);一句之后的都删掉试一试。(也就是后面直接根 end; )<br><br>&nbsp; 不过,我在发送完键盘事件之后想再次通过AppActivate激活本程序——失败了——键盘事件又<br>发回本程序了。你可以在激活本程序之前ProcessMessages and Sleep N次,应该能行的。
 
creation-zy:<br>我用的是98se+D5,<br>记事本的标题是‘无标题 - 记事本'。<br>运行后Click Button1,<br>乱响一阵,程序没响应。<br>如果只run下列代码:<br>&nbsp; Memo1.CopyToClipboard;<br>&nbsp; AppActivate('无标题 - 记事本'); <br>则任务栏上的记事本会不停闪烁,直到手动激活记事本。<br>
 
procedure TForm1.Button4Click(Sender: TObject);<br>begin<br>&nbsp; Memo1.SelectAll;<br>&nbsp; Memo1.CopyToClipboard;<br>&nbsp; AppActivate('未定标题 - 记事本');<br>&nbsp; SendKeys('^v',false);<br>&nbsp; SendKeys('abcABC ?!',false);<br>&nbsp; Application.ProcessMessages;<br>&nbsp; AppActivate('你好!'); //本程序的标题<br>end;<br><br>我没辙了,在我这里一切正常。上面的程序已经可以激活记事本、发送键盘事件然后回到本程序了。<br>你用Kingron的办法吧,只要能够得到记事本的Handle就可以了,至于如何发送特殊的键盘事件,<br>看一看sndkey32.pas的源码就差不多了,以前的贴子也有很多。<br>Good Luck!
 
Kingron:<br>用你的办法,具体如何实现。
 
首先在中放入 &nbsp;2个BOtton:BOTTON_1 、botton_2和2 个Memo:memo1,memo2 <br>&nbsp;在Botton_1 中写如下代码<br>  memo2.text:=memo1.text;<br>&nbsp; &nbsp; memo1.lines.clear;<br>在Botton_2 中写如下代码<br>&nbsp; winexec('c:/windows/note.exe',1);<br>&nbsp;可实现你的要求。<br>
 
试试下面的代码,应该实现你的要求了:<br>procedure TForm2.Button1Click(Sender: TObject);<br>const<br>&nbsp; NotepadCaption = 'Untitled - Notepad';<br><br>&nbsp; function FindTargetHWnd: THandle;<br>&nbsp; var<br>&nbsp; &nbsp; HPwnd: THandle;<br>&nbsp; begin<br>&nbsp; &nbsp; HPwnd := FindWindow(nil, PChar(NotepadCaption));<br>&nbsp; &nbsp; Result := FindWindowEx(HPwnd, 0, 'Edit', nil);<br>&nbsp; end;<br>var<br>&nbsp; S: string;<br>&nbsp; Hwnd: THandle;<br>begin<br>&nbsp; S := Memo1.Text;<br>&nbsp; Hwnd := FindTargetHWnd;<br>&nbsp; SendMessage(Hwnd, WM_SETTEXT, 0, Integer(S));<br>&nbsp; SendMessage(Hwnd, EM_SETSEL, 0, -1);<br>end;<br>
 
后退
顶部