C#主动程序识别

时间:2017-06-01 17:48:09

标签: c#

我目前正在开发基于Arduino的可编程键盘。 C#程序获取通过USB按下键的信息。到现在为止,我可以使用快捷方式打开程序......

作为补充,我希望为不同的程序提供不同的键绑定。 为了实现这一点,我必须从活动程序中获取特定的详细信息,例如exe文件的名称。

搜索时我发现,我可以使用Symbol函数获取活动窗口,我知道,我必须使用另一个Windows函数,但我还没找到哪一个。

我能够获得窗口的标题文本,但是这个文本对于每个打开的Word文档都是不同的,所以我无法使用它。

任何人都有一个线索,我可以使用哪个函数来获取特定的东西以与if语句进行比较,如下所示:

GetActiveWindow

1 个答案:

答案 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,则可以使用GetModuleFileNameExGetProcessImageFileNameQueryFullProcessImageName执行此操作。您需要使用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