- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试获取位于我的 C# 2.0 应用程序之外的窗口的可执行文件的名称。我的应用程序当前使用来自“user32.dll”的 GetForegroundWindow() 调用获取窗口句柄 (hWnd)。
根据我能够进行的挖掘,我想我想使用 GetModuleFileNameEx() 函数(来自 PSAPI)来获取名称,但是 GetModuleFileNameEx() 需要一个进程的句柄,而不是一个窗口。
是否可以从窗口句柄获取进程句柄? (需要先获取窗口的线程句柄吗?)
编辑了第一句话,使我想做的事情更清楚。
更新!这是我发现对我有用的 C# 代码。唯一需要注意的是,偶尔它会返回驱动器号为“?”的文件/路径。而不是实际的驱动器号(如“C”)。 -- 还没有弄清楚为什么。
[DllImport("user32.dll")]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Int32 bInheritHandle, UInt32 dwProcessId);
[DllImport("psapi.dll")]
static extern uint GetModuleFileNameEx(IntPtr hProcess, IntPtr hModule, [Out] StringBuilder lpBaseName, [In] [MarshalAs(UnmanagedType.U4)] int nSize);
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
private string GetWindowModuleFileName(IntPtr hWnd)
{
uint processId = 0;
const int nChars = 1024;
StringBuilder filename = new StringBuilder(nChars);
GetWindowThreadProcessId(hWnd, out processId);
IntPtr hProcess = OpenProcess(1040, 0, processId);
GetModuleFileNameEx(hProcess,IntPtr.Zero,filename,nChars);
CloseHandle(hProcess);
return (filename.ToString());
}
最佳答案
现在已经为同样的问题苦苦挣扎了一个小时,还通过使用 GetModuleFileNameEx 将第一个字母替换为 ?。Finaly 使用 System.Diagnostics.Process 类提出了这个解决方案。
[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId);
void GetProcessPathFromWindowHandle(IntPtr hwnd)
{
uint pid = 0;
Win32.GetWindowThreadProcessId(hwnd, out pid);
Process p = Process.GetProcessById((int)pid);
return p.MainModule.FileName;
}
关于c# - 如果我只有一个窗口句柄 (hWnd),我该如何 GetModuleFileName()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/277085/
我试图通过使用这段代码将当前的可执行路径获取到一个字符串中(我也尝试过它的其他几个版本,但它们都没有真正起作用,我总是在某些时候遇到访问冲突) char *filename = new char[MA
MSDN docs状态: lpFilename [out] A pointer to a buffer that receives the fully qualified path of the mo
为什么下面的代码不打印调用程序的路径名? #include int main() { TCHAR buffer[MAX_PATH]; GetModuleFileName(NULL,bu
我正在尝试使用 VS c++ 获取 win7 下的当前目录,但是 TCHAR pBuf[MAX_PATH]; int bytes = GetModuleFileName(NULL, pBuf, MAX
以下代码: #include #include using namespace std; int main () { LPWSTR buffer; //or wchar_t * buffer;
这是我的代码。我有一个缓冲区来保存输出,但它返回数字。有人可以解释一下吗?我怎样才能得到我的 exe 文件? wchar_t buffer[MAX_PATH]; GetModuleFileName(N
你好,我正在尝试从当前进程中检索路径...这是我的第一个代码: #include #include using namespace std; int CALLBACK WinMain( H
GetModuleFileName()将缓冲区和缓冲区大小作为输入;然而它的返回值只能告诉我们复制了多少个字符,以及大小是否不够(ERROR_INSUFFICIENT_BUFFER)。 如何确定为 G
这两者之间有什么区别(如果有的话)? MSDN 很不清楚。 这里听起来它们是等价的: https://msdn.microsoft.com/en-us/library/windows/desktop/
我正在为 COM 创建一个对象 Set FM_L = CreateObject("FMInterface.FMDebug") 在 VBScript 中。在 Fmdebug 中,我有一个调用 GetMo
我正在尝试获取位于我的 C# 2.0 应用程序之外的窗口的可执行文件的名称。我的应用程序当前使用来自“user32.dll”的 GetForegroundWindow() 调用获取窗口句柄 (hWnd
我创建了这个方法,它应该返回完整路径和文件名,以便我可以唯一地标识一个程序。但是,它只返回 C:\Program Files (x86)\Java\jre6\bin\javaw.exe或空字符串,而不
我调用这个函数来获取 exe 的路径。 GetModuleFileName(NULL, ...问题是有时它会返回短路径 (8.3) 而不是正常的长路径。 MSDN指定 The string retur
我尝试找出使用跨平台 POCO c++ lib 获取应用程序的 exe 文件名的方法。 尝试过: char* FileName ; FileName = const_cast(Application
我完全不知道这是怎么发生的。我正在尝试使用 GetModuleFileName 获取可执行文件(cmd.exe)的实际全名。调试显示 GetModuleFileName 输出了正确的路径,但就在调用
我在我的应用程序中使用 libeay32.dll/ssleay32.dll 库来支持 https。库在 Windows 7 上成功加载(不是通过我的应用程序,通过 Qt 库),但是我在 Windows
我是一名优秀的程序员,十分优秀!