Questions about Window Handles

走远了吗. 提交于 2019-12-25 04:29:25

问题


lang: c#.net 2.0

I have a Application X, that calls SubWindows 1, 2 and 3.

I will Pop up a MessageBox, when 1, 2 or 3 is opened.

My idea is a timer that ticks every 3 seconds and checks if the windows are opened.

But how to find the 3 exact windows? Can I use a Window-Handle-Spy-Application and Hardcode the Window-Handles in my code to find them ever? Or change the window handle when the Application X is opened new?


回答1:


I'm going to answer in terms of Win32 because I'm more familiar with Win32 than the .Net Framework and you can find the appropriate functions in the .Net Framework or use P/Invoke to call these Win32 functions.

I'm assuming that you know the following:

  • Process ID of Application X.
  • The name (or text) or Windows 1, 2, 3 and that these windows have uniquely identifiable text.

If you don't know the process id you need to enumerate the processes and compare each process's name to Application X and when you get a match, then you know the process id.

To find the three windows the first thing we need to do is find the top level windows with the process ID. One of these will be the ancestor of the subwindows.

Enumerate all windows using EnumWindows(); During the enumeration make a note of all windows (there may be more than one) that have the process id you are looking for.

With the list of windows matching the process id, you need to check all the descendents of each window in that list. You can do that by using EnumChildWindows(); Make sure you do all child windows of the child windows etc until there are no more. That way you'll cover every window in the process. For each window you find, compare it the known text of the subwindows you are looking for. When you get a match store that HWND somewhere you can use it.

Now that you have the HWNDs, I'm assuming you can turn them into .Net usable Windows controls.

I did a quick search, it seems that EnumWindows is not part of the .Net Framework, so you will have to use P/Invoke to do this work. It may just be easier for you to write a helper function in C/C++ that does all the searching and just passes back the HWNDs in an array - that way you only have to call one function via P/Invoke and all the work for this searching can be done in C/C++ where calling Win32 directly will be more straightforward.



来源:https://stackoverflow.com/questions/2432566/questions-about-window-handles

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!