我取得该Edit控件的句柄后,用SendMessage(hEdit,WM_SETTEXT,0,LPARAM(MyMsg)直接发
消息修改Edit的文本,没有反应;在SendMessage前面加上一句Sleep(N),则当N足够大时
可以成功修改Edit的内容,N不够大时可能成功,也可能失败。
是否有一种方法判断什么时候能发SendMessage?
(SnedMessage之前,Edit的内容为空)
消息修改Edit的文本,没有反应;在SendMessage前面加上一句Sleep(N),则当N足够大时
可以成功修改Edit的内容,N不够大时可能成功,也可能失败。
是否有一种方法判断什么时候能发SendMessage?
(SnedMessage之前,Edit的内容为空)
解决方案 »
- 关于PageControl关闭后webbrowser未释放
- 我用 kol 了后 再 用 HttpGe。pas后 程序下载怎么没有反映啊 谁可以帮我啊 急啊
- 一个关于stringgrid显示数据库内容的问题(回调函数)
- 千分求助条码打印!!!!急求!!急求!!急求!!急求!!
- 求好一点的日历控件。
- 请高手看看这是用什么方式加密(转码或混淆)了?
- 高分求救,在DELPHI中如何实现像在网页中一样的OLE,也就是说,可以直接在IE中调用WORD并且使其成为一个完整的整体。
- Dcom三层结构的多用户冲突问题?
- 什么叫重载?什么叫多态性?能不能做个恰当的比喻
- delete from tt where 编号='0001'怎么不能删除该条记录
- delphi7 中Access violation at address 0012F88F.错误后有提示0012F9DB错误,其他操作都能正常使用
- 如何在程序里捕获键盘事件?
方法一:
while True do
if (SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(PicName))<>0) then
break;方法二:
while (SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(PicName))=0) do;方法三:
EditText := '';
while EditText<>PicName do
begin
SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(Path+PicName));
SendMessage(hEdit, WM_GETTEXT, 255, LongInt(@EditText));
end;我做的事情是:打开WINDOWS自带的画图程序(MSPAINT.EXE),然后循环以下步骤,处理一批JPG文件:
A、调出“打开”对话框;
B、自动填入文件名;
C、自动执行“打开”按钮的功能;
D、对装入的JPG作一些处理;
E、发送“CTRL+S”消息进行保存现在就是步骤B可能会失败,一旦失败,程序就卡住了,必须手工关闭对话框才行。源程序如下,请DX们看看:
…………
while True do //wait for open the main window(MSPAINT.EXE)
begin
FWindowHandle:=FindWindow(PChar('MSPaintApp'),nil);
if FWindowHandle<>0 then
begin
PaintOpened := True;
break;
end;
end; if PaintOpened then
for i:=0 to (FileList.Count-1) do
begin
ProcessJPG(FileList[i]); //
sleep(600); //wait for write file to disk;
Gauge1.Progress := Gauge1.Progress+1;
end;
…………
procedure TForm1.ProcessJPG(PicName: string);
var
i: integer;
DlgOpend: Boolean;
hDlg, h1, h2, hEdit: THandle;
EditText: array[0..255] of char;
begin
DlgOpend := False;
hDlg := 0;
h1 := 0;
h2 := 0;
hEdit := 0; PostMessage(FWindowHandle,WM_COMMAND,57601,0); //Call by the "Open" dialog for i:=0 to 60 do //wait 6 seconds for open the main window
begin
hDlg:=FindWindow(nil,'打开');
if hDlg<>0 then
begin
DlgOpend := True;
break;
end;
Sleep(100);
end; if DlgOpend then
begin
h1 := GetDlgItem(hDlg,1148);
if h1<>0 then
begin
h2 := GetDlgItem(h1,1148);
if h2<>0 then
begin
hEdit := GetDlgItem(h2,1148);
if hEdit<>0 then
begin
EditText := ''; while EditText<>(PicName) do
begin
SendMessage(hEdit, WM_SETTEXT, 0, LPARAM(PicName));
SendMessage(hEdit, WM_GETTEXT, 255, LongInt(@EditText));
end;
PostMessage(hDlg, WM_COMMAND, IDOK, 0); // Hotkey: "OK"
for i:=0 to 600 do
begin
hDlg:=FindWindow(nil,'打开');
if hDlg=0 then
begin
………… // Processing the image
PostMessage(FWindowHandle,WM_COMMAND,57603,0); //Hotkey: Ctrl+S
break;
end;
Sleep(100);
end;
end;
end;
end;
end;
end;
用画图打开一个文件不应该用你这种低效率的方法。简单的做法是执行下面的代码实现:WinExec('mspaint c:\eee.jpg',1);
PostMessage发送WM_SETTEXT消息,Edit窗口没有反应;TO Avan_Lau:
hEdit的确是目标窗口,我是用SPY++取的ID,而且,我是循环处理一批图像,前文说了,向hEdit写文本时“可能失败”,具体地说,打开41个JPG文件,有3、4次会失败,其余30多次是成功的。如果目标窗口不对,就不可能会有成功的。另外,源码中有一句:SendMessage(hEdit, WM_GETTEXT, 255, LongInt(@EditText)),能正确取到文本;TO mwy654321:
WinExec('mspaint c:\eee.jpg',1)当然没问题,可是我要循环处理几千个JPG文件,那就要打开、关闭几千次MSPaint.EXE,效率是不是太低了?而且,为了让程序执行的时候还能做其他的事,MSPaint.EXE必须用线程方式在后台隐式调用,不适合用WinExec方式。