2017-06-01 94 views
0

我目前正在研究基於Arduino的可編程鍵盤。 C#程序獲取通過USB按鍵的信息。到目前爲止,我能夠使用快捷方式打開程序,...C#活動程序識別

作爲一個補充,我希望對不同的程序有不同的鍵綁定。 爲了得到這個工作,我必須從活動程序中獲取特定的細節,如exe文件的名稱。

雖然搜索我已經發現,我可以得到與GetActiveWindow功能的活動窗口,我知道,我必須使用另一個Windows功能,但我還沒有找到哪一個。

我能夠獲得窗口的標題文本,但是這個文本對於每個打開的Word文檔都是不同的,所以我不能使用它。

任何人有哪些功能,我可以使用一個線索,讓特定的比較的東西與if語句,就像這樣:

string activeProgram; 
... 
if(activeProgram=="Word"){...} 
else if(activeProgram=="Chrome"){...} 

回答

1

由於您使用GetActiveWindow你有一個窗口句柄(HWND)。

您可以通過致電GetWindowThreadProcessId來獲取進程ID。

這是P/Invoke的聲明:

[DllImport("user32.dll", SetLastError=true)] 
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); 

一旦你有一個進程ID,你需要找到可執行文件。

如果您要繼續使用Windows API ...您可以使用GetModuleFileNameEx,GetProcessImageFileNameQueryFullProcessImageName。你需要使用OpenProcess來獲得一個進程句柄(hProcess)。

雖然,沒有必要。一旦你有一個進程ID,你可以使用Process得到的可執行文件:

var process = Process.GetProcessById((int)processId); 
var fileName = process.MainModule.FileName; 

注:安全限制仍然適用。您的程序需要具有讀取其他進程所需的權限並獲取文件名。


因此,您可以獲取創建活動窗口的進程的主可執行文件。雖然,如果惡意用戶已經將可執行文件重命名爲別的東西來欺騙你的程序呢? - 獎勵喋喋不休:how to check if a file has a digital signature

+0

代碼工作到目前爲止,我得到了我的文件的完整路徑(這是我可以很好的工作,謝謝你),但問題是,當我想獲得另一個窗口的名稱,我得到Win32異常,因爲我無法使用32位進程訪問64位進程。我可以將自己的文件製作成64位程序嗎?還是有另一種方式? – Schiep

+0

@Schiep首先確保你不是在IntPtr和int之間進行投射。你需要聲明['GetActiveWindow'來返回IntPtr](http://www.pinvoke.net/default.aspx/user32.getactivewindow)。其次,您可能需要爲32位和64位配置編譯目標(在「生成」 - >「配置管理器」下)。請參閱msdn上的[64位應用程序](https://msdn.microsoft.com/en-us/library/ms241064.aspx)。文章[將現有.NET(C#)應用程序移植到64位的注意事項](https://www.ibm.com/support/knowledgecenter/SSGSMK_7.1.1/development_sym/app_net_port_64bit.html)可能會有所幫助(忽略Symphony)。 – Theraot