如何根据窗口的caption找到该窗口?(50分)

S

songmag

Unregistered / Unconfirmed
GUEST, unregistred user!
如何根据窗口的caption找到该窗口?
程序中想根据窗口cation找到该窗口,将其setfocus
用findwindow行吗?但我不太会用.
高手指点
 

var h:thandle;
begin
h:=findwindow(nil,caption);
if h<>0 then//已运行
PostMessage(h,WM_QUIT,0,0);
end;
 
不行呀?h:=findwindow(nil,caption);报错
[Error] Unit1.pas(42): Incompatible types: 'String' and 'PChar'
 
procedure SetFormFocus(Title: String);
var
h: thandle;
begin
h := FindWindow(nil, PChar(caption)); //把string转化成pchar
if h<>0 then
SetForegroundWindow(h);
end;
 
var
s : string;

s := caption;
h:=findwindow(nil,pchar(s));
 
h:=findwindow(nil,pchar(caption));不就行了吗?给分吧!:P
 
我是想找出窗口后,将其设为激活状态,能用setfocus吗,怎么做啊?
 
to songmag
我上面的 SetForegroundWindow(h); 不能用吗?
 
qianwt不是讲了吗
 
一点反映都没有?
 
setforegroundwindow(h);
setactivewindow(h);试试
 
procedure TForm1.Button1Click(Sender: TObject);
var
hHandle:hwnd;
begin
hHandle := findwindow(nil,'计算器');
SetForegroundWindow(hHandle);
end;
用这段代码,试验计算器窗口,如果行的话,看看你程序里,窗口标题是否正确,可以检查
findwindow以后的hHandle是否为空。
 
我觉得好像不是这问题,我在if h<>0 then 下写什么都不没用,好像h=0
但窗口明明打开了。 我的窗口caption='窗口一'
 
那就是findwindow没找到窗口句柄了,setforegroundwindow当然不起作用,你用计算器作试验
能行吧!!!! 那你再查查你的窗口标题之类的。
 
我忽略了:
var h:thandle;
begin
h:=findwindow(nil,pachr(caption));
//或者h:=findwindow(nil,'查询系统'); 这时系统自动转换为Pchar类型
if h<>0 then//已运行
//PostMessage(h,WM_QUIT,0,0);这时关闭当前窗体
SetForegroundWindow(h);
end;
 
查阅可视窗口标题

下面只是举出一个例子提供参考:运用API函数GetWindow()配合GetWindowText()逐一查出各视窗的标题

1. File | New Project 开始一个新的工程
2. 在 Form1 中安排 Button 与 Memo 各一
3. 在 Button1 的 OnClick 事件中撰写程式如下:
procedure TForm1.Button1Click(Sender: Tobject);
var
hCurrentWindow: HWnd;
szText: array[0..254] of char;
begin
hCurrentWindow := GetWindow(Handle, GW_HWNDFIRST);
while hCurrentWindow <> 0 do
begin
if GetWindowText(hCurrentWindow, @szText, 255)>0
then Memo1.Lines.Add(StrPas(@szText));
hCurrentWindow:=
GetWindow(hCurrentWindow, GW_HWNDNEXT);
end;
end;

 
我的程序:多文档窗口,打开一子窗口后,主窗口菜单加入新打开子窗口标题,
点击菜单中窗口标题项,相应子窗口变为激活态。
以上各位高手的方法我试了,可不行,没反应。是不是不适应多文档窗口?
 
to songmag

看看下面的可以吗

program Project1;

uses
Forms,
Windows,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

var
h: THandle;
begin
h := FindWindow(nil, 'Form1');
if h<>0 then
begin
SetForegroundWindow(h);
Exit;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.

我试了一下可以的,但要注意不要在Delphi中直接运行,你先把查找的窗体关闭,
然后在window中打开此程序,再打开的时候系统就会让第一次打开的获得焦点,
第二次不打开,始终保持程序打开一次
 
FindWindow
函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符
串相匹配。这个函数不查找子窗口。在查找时不区分大小写。
函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName);
但我确实要查子窗口,不只有没有这样的函数?
请高手赐教
 
多文档当然不行了,用多文档的方法做。
var
i:Integer;
begin
for i:=0 to self.MDIChildCount-1 do
begin
if Self.MDIChildren.Caption='Form2' then
Self.MDIChildren.SetFocus;
end;
 
顶部