怎样取得当前窗口的前一个活动窗口的句柄?(50分)

  • 主题发起人 主题发起人 helloymz
  • 开始时间 开始时间
H

helloymz

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样取得当前窗口的前一个活动窗口?<br>例如我刚才用记事本输入,现在切换到我写的那个程序的窗体上面。<br>当前窗体是我自己的那个窗体。前一个活动窗体应该是记事本。<br>请问应该怎么取到他的句柄?
 
用一个全局变量如 hand := customForm.Handle 把前一个活动窗体的句柄记录下来
 
对不起,不熟,不过我认为要么不可能,要么很简单,这是platform的事,如果有这样的api就好:<br>getprevioushandle(currenthwd),你查查win32api吧
 
个人感觉可能用 &nbsp;Enumwindows(@EnumWindowsProc,0); 然后取你的进程的下一个hwnd就是了.<br><br>没试过,,不知道可不可行.
 
sorry,不会。
 
我自己写了一个响应WM_ACTIVATE消息的代码,如下:<br>声明:procedure wmsetfocus(var Message:TMessage) ;message WM_ACTIVATE;<br>定义:<br>procedure tform1.WMsetfocus(var Message:TMessage) ;<br>VAR<br>&nbsp; hwndcurrent:integer;<br>begin<br>&nbsp; &nbsp; &nbsp;hwndcurrent := HWND(message.lParam);<br>&nbsp; &nbsp; &nbsp;GetWindowText(hwndcurrent,pstr,255);<br>end;<br>如果两个窗体是在同一个程序里面(比如form1,form2),那么从form2切换到form1上面的时候<br>是可以取到上一个活动窗体的句柄。但是,如果上一个窗体是别的一个程序,<br>那么hwndcurrent返回的始终是0。这是为什么阿?<br>不知道这样写对不对。<br>
 
使用API函数<br>GetNextWindow(当前窗口.handle,GW_HWNDPREV)<br>
 
呵呵,最后实在不行,做个全局的钩子,,记录最近3个窗口的hwnd :)) 这个办法很笨,不建议采用
 
to:xeen<br>GetNextWindow(当前窗口.handle,GW_HWNDPREV)<br>我试过了阿,得到的不是前一个活动窗口的句柄阿?<br>
 
to 淡淡的笑<br>如果最后没有办法也只能这样了:)但是我觉得用windows的消息应该能够搞定。。
 
同意xeen<br><br>如果不行就同意淡淡的笑[:D]
 
GetNextWindow(Handle, GW_HWNDPREV);取得的就是前一个Window,只不过这个Window<br>往往是输入法的窗口(Default IME),因此你可能要继续调用往前找直到你要的。<br>var<br>&nbsp; H: THandle;<br>&nbsp; S: string;<br>begin<br>&nbsp; H := GetNextWindow(Handle, GW_HWNDPREV);<br>&nbsp; S := '';<br>&nbsp; if IsWindow(H) then<br>&nbsp; begin<br>&nbsp; &nbsp; SetLength(S, MAX_PATH);<br>&nbsp; &nbsp; SetLength(S, GetWindowText(H, PChar(S), MAX_PATH));<br>&nbsp; end;<br>&nbsp; Edit1.Text := S;<br>
 
to :xianjun<br>你说的对,我总是得到default ime 再往前得到的句柄就都是0了 。<br>这位大哥,那我要怎样才能找到我想要的窗体?
 
最好的办法就是记录窗口<br>没有相关的api<br>GetNextWindow,GetParent等api都是窗口创建时确定的<br>而你要的是切换时的窗口
 
to 热血兄<br>&nbsp; &nbsp;记录窗口?是不是用hook?
 
sorry, 不是很清楚。
 
似乎只能那个是GetNextWindow了。确实Windows有他的顺序,你按Alt+Tab就可以看到。<br>但是我们获取的似乎只有GetNextWindows这个API了,获取顶层可见的窗口。应该可以的。
 
如果windows有他的顺序的话,那我们用getnextwindow怎么样也得不到上一个活动的窗体啊。<br>因为他是不固定的。<br>能不能利用WM_ACTIVATE这个消息啊?
 
//不知道对不对的。改了xianjun的程序<br>var<br>&nbsp; H: THandle;<br>&nbsp; S: string;<br>begin<br>&nbsp; S := 'Default IME';<br>&nbsp; H := GetNextWindow(Handle, GW_HWNDNEXT);<br>&nbsp; while (S = 'Default IME') do<br>&nbsp; begin<br>&nbsp; &nbsp; H := GetNextWindow(H, GW_HWNDNEXT);<br>&nbsp; &nbsp; if IsWindow(H) then<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; SetLength(S, MAX_PATH);<br>&nbsp; &nbsp; &nbsp; SetLength(S, GetWindowText(H, PChar(S), MAX_PATH));<br>&nbsp; &nbsp; &nbsp; Edit1.Text := S+' --- '+IntToHex(H,0);<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>end;
 
sorry。<br>提前。
 
后退
顶部