我目前正在开发基于Arduino的可编程键盘。 C#程序获取通过USB按下键的信息。到现在为止,我可以使用快捷方式打开程序......
作为补充,我希望为不同的程序提供不同的键绑定。 为了实现这一点,我必须从活动程序中获取特定的详细信息,例如exe文件的名称。
搜索时我发现,我可以使用Symbol
函数获取活动窗口,我知道,我必须使用另一个Windows函数,但我还没找到哪一个。
我能够获得窗口的标题文本,但是这个文本对于每个打开的Word文档都是不同的,所以我无法使用它。
任何人都有一个线索,我可以使用哪个函数来获取特定的东西以与if语句进行比较,如下所示:
GetActiveWindow
答案 0 :(得分:1)
由于您使用的是GetActiveWindow
,因此您有一个窗口句柄(hWnd)。
您可以通过调用GetWindowThreadProcessId
来使用它来获取流程ID。
这是P / Invoke声明:
[DllImport("user32.dll", SetLastError=true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
获得Process ID后,您需要找到可执行文件。
如果您要继续使用Windows API,则可以使用GetModuleFileNameEx
,GetProcessImageFileName
或QueryFullProcessImageName
执行此操作。您需要使用OpenProcess
来获取进程句柄(hProcess)。
虽然没有必要。获得Process ID后,您可以使用Process
获取可执行文件:
var process = Process.GetProcessById((int)processId);
var fileName = process.MainModule.FileName;
注意:安全限制仍然适用。您的程序需要具有读取其他进程所需的权限并获取文件名。
这样,您就可以获得创建活动窗口的进程的主要可执行文件。如果恶意用户将可执行文件重命名为其他东西以欺骗您的程序,该怎么办? - Bonus chatter:how to check if a file has a digital signature。