Tag: winapi

为PInvoke正确声明SP_DEVICE_INTERFACE_DETAIL_DATA

SP_DEVICE_INTERFACE_DETAIL_DATA结构: typedef struct _SP_DEVICE_INTERFACE_DETAIL_DATA { DWORD cbSize; TCHAR DevicePath[ANYSIZE_ARRAY]; } SP_DEVICE_INTERFACE_DETAIL_DATA, *PSP_DEVICE_INTERFACE_DETAIL_DATA; 如何在C#中声明它以使Marshal.SizeOf正常工作? 我没有分配动态缓冲区的问题。 我只想以适当的非硬编码方式计算cbSize 。 PInvoke.net的定义是错误的。 PInvoke.net的解释也是错误的: SP_DEVICE_INTERFACE_DETAIL_DATA didd = new SP_DEVICE_INTERFACE_DETAIL_DATA(); didd.cbSize = 4 + Marshal.SystemDefaultCharSize; // trust me 🙂 不要相信他。 4 + Marshal.SystemDefaultCharSize仅在x86上有效。 sizeof(int) + Marshal.SystemDefaultCharSize 。 在x64上,它失败了。 这是非托管C ++给出的: 86 结构尺寸A: 5 设备路径偏移A: 4 结构尺寸W: 6 设备路径W的偏移量: 4 64位 结构尺寸A: 8 […]

在另一个用户上下文中执行代码

我的应用程序带有需要以管理员身份运行的清单,但应用程序的一部分是使用WNetAddConnection2映射驱动器,我相信由于凭据等原因,它需要在普通用户上下文中运行。有没有办法执行此操作普通用户上下文中的一些代码,无需创建单独的进程。 编辑 从我的评论到目前为止,但它不起作用。 我预计它不会因为我真的不明白我应该如何使用它。 如果我打开一个新问题,也许最好? class Program { [DllImport(“advapi32.DLL”)] public static extern bool ImpersonateLoggedOnUser(IntPtr hToken); [DllImport(“advapi32.DLL”)] public static extern bool RevertToSelf(); static void Main(string[] args) { IntPtr phToken = IntPtr.Zero; ImpersonateLoggedOnUser(phToken); MapDrives(); RevertToSelf(); } } 编辑 如果当前用户具有管理员权限,那么主进程将使用清单提升,在提升的代码中我想在用户非提升空间中运行命令,因为这似乎具有不同的环境变量等。我相信曾经线程启动它不能改变自己,它需要运行一个新的。

从其他应用程序问题捕获所选文本

我在C#中编写了一小段代码来捕获其他应用程序中的选定文本: SendKeys.SendWait(“^c”); string searchedText = Convert.ToString(Clipboard.GetText()); 我的问题是,如果我从浏览器中捕获文本,它无法正常工作Chrome有人知道为什么会发生这种情况或者是否有其他方法可以执行相同的任务 UPDATE 我正在执行此应用程序以从任何其他应用程序捕获所选文本,并在用户按热键时将其保存在文件中。 protected override void WndProc(ref System.Windows.Forms.Message m) { // let the base class process the message base.WndProc(ref m); // if this is a WM_HOTKEY message, notify the parent object const int WM_HOTKEY = 0x312; if (m.Msg == WM_HOTKEY) { SendKeys.SendWait(“^c”); string searchedText = Convert.ToString(Clipboard.GetText()); Save(searchedText); Clipboard.Clear(); } […]

在C#/ .NET中为PostMessage()创建WM_TOUCH消息

(有关背景信息,请参阅为SendMessage()编写WM_TOUCH消息,Kinect作为多点触控设备 ,它与我的问题基本相同,但其接受的答案实际上没有回答问题。棘手的一点是没有填写TOUCHINPUT结构,但制作有效的触摸输入句柄。) 我想以令人讨厌的hackish方式模拟多点触摸输入设备的存在,其概括如下: while (true) { choose locations etc. for simulated touches; PostMessage(GetForegroundWindow(), WM_TOUCH, nTouches, …); } 棘手的一点就是标有“……”的空间。 从WM_TOUCH消息的消费者的角度来看,MSDN文档不出所料地写道, WM_TOUCH消息的lParam是 触摸输入句柄,可用于调用GetTouchInputInfo以检索有关与此消息关联的触摸点的详细信息。 我可以轻松地制作,例如,一个TOUCHINPUT结构数组,这是GetTouchInputInfo为您提供的。 但这似乎与“触摸输入手柄”完全不同。 (例如,触摸输入句柄需要传递给CloseTouchInputHandle ,据称PostMessage或SendMessage将执行此操作。) 用户代码是否可以(正式或非正式!)生成可以传递给PostMessage的有效触摸输入句柄? 如果是这样,怎么样?

为什么有些本机线程在我的代码中没有原点的堆栈跟踪?

我使用任务并行库大量使用C#.NET 4.5应用程序,经过几天的操作后最终会因为线程而缺乏资源。 当我从AdPlus中获取HANG转储并通过Visual Studio查看线程时,我看到43个线程在我的代码中没有明显的起源: ntdll.dll!_NtWaitForSingleObject@12() + 0x15 bytes ntdll.dll!_NtWaitForSingleObject@12() + 0x15 bytes kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes 为什么这些线程在堆栈跟踪中没有显示托管源?

将图像加载到MenuItem上会使预乘的alpha图像失去透明度

我真的需要一些帮助。 我正在尝试将一个我认为32bpp的图像加载到MenuItem上的预乘alpha( 我按照本指南在GIMP中制作图像 )。 我知道ContextMenuStrip类,不想使用它。 以下是我用于将图像设置到MenuItem上的代码: // apis [DllImport(“user32.dll”, SetLastError = true)] static extern bool SetMenuItemInfo(IntPtr hMenu, uint uItem, bool fByPosition, [In] ref MENUITEMINFO lpmii); [DllImport(“user32.dll”, SetLastError = true, CharSet = CharSet.Auto)] static extern IntPtr LoadImage(IntPtr hinst, string lpszName, uint uType, int cxDesired, int cyDesired, uint fuLoad); // structures [StructLayout(LayoutKind.Sequential)] struct MENUITEMINFO { public uint […]

获取顶部窗口的句柄(按Z索引排序窗口)

我正在尝试编写一个方法,该方法接受窗口句柄列表并返回具有最高z索引的窗口的句柄等。 但徒劳无功。 任何人都可以给我一个建议怎么做?

在Windows服务中禁用特定的USB磁盘

有谁知道如何防止在Windows服务中安装特定的USB磁盘/闪存? 我不想禁用所有USB端口,我只是阻止安装特定的USB磁盘。 我正在使用Windows 7。

当用作Win32回调时,是否需要固定C#方法?

我正在将一个C#实例方法传递给Win32 API调用,该调用稍后将用作从Windows到我的应用程序的回调函数。 当我传递对象的引用时,该引用被临时固定,直到调用返回(参见Jason Clark的这篇文章 )。 如果API调用将在调用返回后保留地址供以后使用,我必须在调用之前显式地固定对象(我可以通过Marshal.AllocHGlobal从非托管内存中分配它,或者我可以通过GCHandle固定托管对象) 。 Alloc )。 但是,保留用作Win32 API回调的方法呢? 具体来说,我有这个代码: protected const int CALLBACK_FUNCTION = 0x30000; private delegate void MidiInProc( int handle, uint msg, int instance, int param1, int param2); [DllImport(“winmm.dll”)] private static extern int midiInOpen( out int handle, int deviceID, MidiInProc proc, int instance, int flags); private void MidiInProcess( int hMidiIn, uint […]

Clipboard.GetText会覆盖剪贴板吗?

这就是我想要做的事情:当我按下Ctrl-C时,有一些游戏会将鼠标光标下的项目信息写入剪贴板。 我试图抓住这些信息并从中选择一些我需要的东西。 我这样做: //at form load RegisterHotKey(this.Handle, 0, 0x002, (int)Keys.C); protected override void WndProc(ref Message m) { if (m.Msg == 0x0312) { int id = m.WParam.ToInt32(); if (id == 0) { System.Threading.Thread.Sleep(155); //ive thought if i add some delay it would help but it doesnt… string textFromClipboard = Clipboard.GetText(); if (textFromClipboard.Contains(“Itemlevel: “)) { // do […]