我想将键盘输入发送到另一个进程中的窗口,而不将该窗口置于前台。我可以使用PostMessage伪造WM_KEYDOWN和WM_KEYUP;我只需要知道哪个窗口句柄应该接收键盘输入——即类似GetFocus的东西,但对于另一个非事件应用程序。GetGUIThreadInfoAPI看起来很有前途——它为另一个应用程序返回一个hwndFocus。但是我没有运气让它在我的64位操作系统上从C#运行。我已经复制(然后进一步调整)来自pinvoke.net的声明,但我得到的只是一个通用错误代码(下面有更多详细信息)。我在调用GetGUIThreadInfo之前设置了cbSize,因此我避免了最明显
我正在使用Windows服务中的CreateProcessAsUser(我们能否切题并假设我有充分的理由这样做)。与其他人在这里提出的问题相反,我在我的事件终端session(session1)中获得了一个窗口,而不是与服务(session0)相同的session-这是不可取的。我拨了ScottAllen'scode;并提出以下内容。显着的变化是“恢复self”、“CREATE_NO_WINDOW”和命令行参数支持。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSys
我一直在努力从我的应用程序的任务栏中隐藏另一个应用程序。我一直在使用SetWindowLong函数以在extendedstyle上设置/删除WS_EX_APPWINDOW.我尝试过分别设置和删除属性,以及获取当前的WindowLong,然后将其删除/添加到那个属性中,如下所示:SetWindowLong(pMainWindow,GWL_EXSTYLE,GetWindowLong(pMainWindow)&WS_EX_APPWINDOW);并尝试像这样删除它:SetWindowLong(pMainWindow,GWL_EXSTYLE,GetWindowLong(pMainWindow)&
有一个greatansweronSO关于如何在运行时为DllImport设置搜索目录。使用两行代码即可正常工作。但是,许多开源项目改为使用LoadLibrary函数。有“谣言”说通过委托(delegate)调用native方法速度较慢。我称它们为“谣言”,因为我只在两个地方看到过这种情况,而且无论如何这都是微观优化。最有意思的地方是这篇博文:http://ybeernet.blogspot.com/2011/03/techniques-of-calling-unmanaged-code.html在那里,作者测量了不同技术的性能:C#(信息性)4318毫秒PInvoke-抑制安全5415
这个问题在这里已经有了答案:HowdoIhandlenulloroptionalDLLstructparameters(1个回答)关闭4年前。我有几个p/invoked函数(但我现在正在重写我的代码,所以我正在整理),我想知道如何使用/传递一个可空类型作为参数之一。使用int类型不是问题,但考虑到以下情况:[DllImport("setupapi.dll",CharSet=CharSet.Auto,SetLastError=true)]staticexternIntPtrSetupDiGetClassDevs(refGuidClassGuid,int?enumerator,IntPtr
我正在编写一个使用一些非托管代码的跨平台.NET库。在我的类的静态构造函数中,检测到平台并从嵌入式资源中提取适当的非托管库并保存到临时目录,类似于anotherstackoverflowanswer中给出的代码。.为了在库不在PATH中时可以找到它,我在将它保存到临时文件后显式加载它。在Windows上,这适用于来自kernel32.dll的LoadLibrary。我正尝试在Linux上对dlopen执行相同的操作,但在稍后加载P/Invoke方法时出现了DllNotFoundException。我已验证库“libindexfile.so”已成功保存到临时目录,并且对dlopen的调用
我正在.NET中重构一个庞大而复杂的代码库,它大量使用P/InvoketoWin32API。项目的结构不是最好的,我发现到处都是DllImport语句,经常重复相同的功能,并且还以多种方式声明:导入指令和方法有时声明为公共(public)的,有时声明为私有(private)的,有时声明为静态的,有时声明为实例方法。我担心重构可能会产生意想不到的后果,但这可能是不可避免的。是否有我可以遵循的记录在案的最佳做法可以帮助我解决问题?我坚持要组织一个静态/共享的Win32P/InvokeAPI类,在一个文件中列出所有这些方法和关联的常量...编辑user32DLL有超过70个导入.(代码库由2
我正在使用DeviceIoControl开发C#项目.我咨询过相关Pinvoke.netpage我的签名:[DllImport("Kernel32.dll",SetLastError=false,CharSet=CharSet.Auto)]publicstaticexternboolDeviceIoControl(SafeFileHandlehDevice,EIOControlCodeIoControlCode,[MarshalAs(UnmanagedType.AsAny)][In]objectInBuffer,uintnInBufferSize,[MarshalAs(Unmanage
我有一个现有的应用程序,它P/调用与应用程序本身位于同一目录中的DLL。现在(由于佳能生产了最糟糕的API之一)我需要支持该API的两个版本并在运行时确定我应该使用哪一个(旧的或新的)。由于DLL具有相同的名称(第一个加载具有相同名称的其他DLL,因此仅重命名第一个对我没有帮助)我必须将它们保存在不同的目录中。因此我的问题是:我必须使用哪些选项来控制DllImport声明中给出的DLL使用的目录?我想我可以从尝试这两个想法中的任何一个开始:1)在执行第一个P/Invoke之前使用“SetDllDirectory”设置我想要的目录,然后在之后重置它。2)使用“LoadLibraryEx”
namingconventionforconstantsinC#是Pascal大小写:privateconstintTheAnswer=42;但有时我们需要表示WindowsAPI中已经存在的常量。例如,我不知道如何命名://////Withthisstyleturnedonforyourform,///Windowsdouble-bufferstheformandallitschildcontrols.///publicconstintWS_EX_COMPOSITED=0x02000000;我应该给它起什么名字?将它保持为WS_EX_COMPOSITED可以让我快速将它与theWin