我的应用程序需要识别每个打开的应用程序的每种形式。例如,如果我在任何应用程序中按“Ctrl + f1”(比如微软Outlook),如果我处于“新消息”形式,我需要向我的应用程序发送一条消息,其中包含以下信息: 过程= OUTLOOK.EXE form =“new message”表单id? (或其他任何标识形式独特? 那可能吗?
换句话说,Windows窗体是唯一标识的吗?
哦,并且窗口句柄不是解决方案,因为它们每次都会改变,我需要一些识别表单的东西,如果我关闭应用程序并重新打开它,它就不会改变。
答案 0 :(得分:4)
答案 1 :(得分:3)
请注意其他应用程序中的窗口,尤其是Outlook,很少是Windows窗体。你需要大量的P / Invoke来完成这项工作。首先你需要的是SetWindowsHookEx()设置一个WH_KEYBOARD_LL钩子,以便你可以检测击键。谷歌很好。
接下来,你需要GetForegroundWindow(),它可以获得具有焦点的窗口的窗口句柄。
接下来,您需要GetWindowThreadProcessId(),它允许您发现拥有该窗口的进程的进程ID。然后,您可以使用Process.GetProcessById()来获取程序的Process对象。有很多信息,Name属性告诉你它是Outlook.exe
有关窗口本身的信息很难获得。不多,但您可以使用GetWindowText()来检索标题栏上显示的文本。如果有用,您可以使用EnumChildWindows枚举窗口中的子控件。
访问pinvoke.net以获取所需的P / Invoke声明。
答案 2 :(得分:1)
每个窗口都有窗口句柄。这是唯一的int32值。此值由Win32 API用于标识窗口。
答案 3 :(得分:1)
嗯 - 如果标题相同,你无法通过其类型确定外部进程的窗口。
您可以使用窗口的句柄 - 但是在窗口的相同“类型”上它会有所不同,并且仅在窗口存在时才有效。
你的想法看起来像某种日志记录 - 并且日志记录句柄不是很合理的IMO。
答案 4 :(得分:1)
虽然窗口句柄是唯一的,但它们对于相同的表单永远不会是相同的值,但它们之间只是唯一的,但是窗口永远不会具有与其句柄相同且唯一的值,这将识别它。
无法唯一标识Windows表单。