Tag: winapi

如何在C#中使用axWindowsMediaPlayer跳转X秒

我正在使用axWindowsMediaPlayer,我有一个video加载,但我想跳X秒。 因此,例如,如果当前时间是video的1分钟,我想跳到1分10秒。

使用IOCTL_DVD_ *控制代码从C#调用DeviceIoControl

我试图从C#调用DeviceIoControl用于IOCTL_DVD_*控制代码。 阅读了大量信息并尝试了一些例子后,我没有取得多大进展。 我最终要做的是获取DVD_LAYER_DESCRIPTOR结构,了解当前DVD驱动器中的媒体。 我可以在DVD设备上成功调用CreateFile ,但是当我尝试使用控制代码IOCTL_DVD_START_SESSION调用DeviceIoControl ,它返回成功代码,但我似乎没有成功恢复sessionId值,总是返回0.(并且任何尝试我然后尝试使用IOCTL_DVD_READ_STRUCTURE获取图层描述失败,即函数失败或返回成功但是给出一个空白的输出结构。) 在找到一些进行类似调用的C代码后,我能够编译这段代码(使用Visual C ++ 2008 Express Edition),并且它成功地能够启动会话,读取DVD_LAYER_DESCRIPTOR ,并且没有问题地关闭会话,所以我知道这有效。 C#问题似乎与如何定义外部函数和编组参数有关。 以及如何定义传递和返回的各种结构。 我已经查看了www.pinvoke.net他们如何定义它,并使用了一些给出的示例代码和定义,但仍然具有上述相同的问题。 部分问题似乎是每个IOCTL控制代码的参数都不同,主要是结构,但对于IOCTL_DVD_START_SESSION ,输出值是32位整数。 如何定义C#中的extern方法来处理这些不同的情况? 另外,使用正确大小的成员类型定义的各种结构显示它们在C和C#代码之间的大小不同,但各个成员的大小相同??? 如果我使用像DeviceIOView这样的程序并观察IOCTL_DVD_START_SESSION的C代码和C#代码IOCTL_DVD_START_SESSION则C版本返回一个3的sessionid,并且当运行C#代码时,DeviceIOView显示发回的数据也是3所以似乎是返回参数的某种编组问题,因为我们在C#代码中只看到0 有没有人有任何想法或工作示例代码如何从C#调用DeviceIoControl来访问DVD信息? (显示应如何定义和使用结构和function。)非常感谢任何指向有用网站或其他建议的链接。 (在Visual C#2008 Express Edition,.NET 3.5中开发。) N Johns 示例代码(已添加) using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Win32.SafeHandles; using System.Runtime.InteropServices; using System.IO; using System.Threading; namespace Example { class Program { static void […]

不使用互操作/非托管代码监视打印假脱机

背景: 我正在使用.NET 4.0在C#中编写应用程序。 它按特定顺序打印一堆文档。 这些文档有各种不同的类型,实际上是使用带有“print”动词的ShellExecute打印的。 为了确保订单不会混乱,我想检查所涉及的打印机的打印队列。 我的主循环看起来像: 在文档上调用“打印”操作 等待文档显示在打印队列中 重复直到完成 如何使用托管代码监控打印队列? 我发现了一些使用非托管调用做类似事情的好例子(例如: http : //blogs.msdn.com/b/martijnh/archive/2009/08/05/printmonitor-ac-print-spooler-monitor.aspx )。 此外,我知道如何查看c:\ windows \ system32 \ spool下的假脱机文件…并以这种方式解决问题。 但是,这些解决方案都没有令人满意……我正在调用非托管鳕鱼的数量,我觉得我应该用C ++编写应用程序。 (并没有.NET依赖/开销。) 主要问题:是否真的无法仅使用托管呼叫监控打印队列? 更一般的问题:我来自java世界,当我想要做一些特定于OS的事情或者需要与MS世界中的其他事物进行交互时,通常只使用.NET语言。 (例如SSIS组件。) 似乎每次我开始一个项目时我都会陷入同样的​​混乱:对本机函数,COM东西等的各种调用等。 次要问题:对于.NET哲学或实现,我是否缺少一些东西? (我是不是觉得托管库做得不够好?对于任何需要执行Windows特定操作的东西,例如操纵打印队列,.NET是错误的选择吗?)我得到(或者我认为)得到的.NET是理论上应该是独立于操作系统的……但是大多数现代操作系统肯定都有打印机和打印队列等等。 (所以如果你有做这些事情的generics调用,它们可以在每个平台的框架版本上实现..)

在LowLevelMouseProc调用中无法使用SendInput发送新的滚动方向

我正在调用下面的代码,它适当地挂钩到WM_MOUSEWHEEL。 我遇到的问题是即使我只是向一个方向发送滚动消息(-120),滚轮也会按预期工作。 我在其中设置了断点以及ifs和预期的工作。 private delegate IntPtr LowLevelMouseProc(int nCode, IntPtr wParam, IntPtr lParam); private static IntPtr HookCallback( int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && MouseMessages.WM_MOUSEWHEEL == (MouseMessages)wParam) { MSLLHOOKSTRUCT hookStruct = (MSLLHOOKSTRUCT)Marshal.PtrToStructure(lParam, typeof(MSLLHOOKSTRUCT)); Console.WriteLine(hookStruct.mouseData); INPUT[] input; input = new INPUT[1]; input[0].type = INPUT_MOUSE; input[0].mi.dx = 0; input[0].mi.dy = 0; input[0].mi.dwFlags = […]

自定义控制框按钮

某些Windows应用程序向控件框添加按钮,这显然是最小化,最大化和关闭按钮组的名称。 一个这样的应用程序是Skype,它有一个按钮,用于从一个窗口 – 包含所有内容模式切换到一个窗口每个会话模式,反之亦然: 我想知道你怎么做到这一点。 我环顾四周,无法弄清楚如何。 我假设它需要P / Invoke和Windows API,但我不确定我使用的是什么function。

按Tab键几次后不再调用线程钩子程序。 为什么?

我安装了一个特定于线程的窗口挂钩来监视发送到WndProc的消息。 它起初工作。 然而,在我按Tab键约19次以在表单周围移动焦点后,我的钩子回调不再被调用。 这种情况发生了我是快速还是慢速按Tab键的问题。 谁能解释一下究竟发生了什么? 下面是我写的代码。 我在Windows 7 64位上测试过它。 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using System.Runtime.InteropServices; namespace HookTest { static class Program { private const int WH_CALLWNDPROC = 4; private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); private class MainForm : Form { private Button button1; private TextBox textBox1; public MainForm() […]

检测c#中的驱动器挂载事件

如何在将新驱动器添加到“我的电脑”时捕获事件,并且最好在NTFS驱动器上创建某个驱动器的新安装点时? 我发现了这个,但它对挂载的文件夹不起作用: _eventWatcher = new ManagementEventWatcher(“SELECT * FROM Win32_VolumeChangeEvent”); _eventWatcher.EventArrived += (o, args) => {switch(args.NewEvent[“EventType”].ToString()[0]) { case ‘2’: //mount Debug.WriteLine(args.NewEvent[“DriveName”]); break; case ‘3’: //unmount break; } }; _eventWatcher.Start(); 有任何想法吗?

如何在Win32 C ++项目中使用C#dll?

我正在研究一个解决方案,它的大部分核心引擎都是作为Win32 C ++开发的(并且与平台无关,也用于OS X),前段时间我们需要从C#调用C ++ dll的核心引擎,我能够在C#中加载主解决方案的DLL(在SO的某些线程的帮助下)。 但是现在我们在Managed C#dll中实现了某些东西,需要在Win32 C ++项目中使用它吗? (只提供函数定义和DLL)

了解AttachThreadInput – 分离失去焦点

我有一个完全理解AttachThreadInput的问题。 我知道它是“连接”2个线程的消息队列,这(我想做的)允许我例如强制我的窗口(winforms)在前台。 我可以用这种方法做什么: private void SetForegroundWindowEx(IntPtr hWnd) { uint SW_SHOW = 5; uint appThread = GetCurrentThreadId(); uint foregroundThread = GetWindowThreadProcessId(GetForegroundWindow(), IntPtr.Zero); if (foregroundThread != appThread) { AttachThreadInput(foregroundThread, appThread, true); BringWindowToTop(hWnd); ShowWindow(hWnd, SW_SHOW); AttachThreadInput(foregroundThread, appThread, false); } else { BringWindowToTop(hWnd); ShowWindow(hWnd, SW_SHOW); } } 然而,一旦线程分离,两个窗口都会失去焦点。 如果我等待消息队列清空(Application.DoEvents())并激活我的窗口(现在处于前台但没有聚焦),它将重新获得焦点并保留它。 如果我在消息队列为空之前执行此操作,它将再次失去焦点。 所以我猜想分离的东西会从我的窗户中获得焦点,但我不知道那是什么或如何防止它。 这是我不太了解的第一件事。 我没有得到的第二件事是,如果我没有将窗口设置为前景: AttachThreadInput(foregroundThread, appThread, true); AttachThreadInput(foregroundThread, appThread, false); […]

.NET Interop IntPtr与ref

可能是一个菜鸟问题但是互操作不是我的优点之一。 除了限制重载次数之外,还有什么理由我应该声明我的DllImports: [DllImport(“user32.dll”)] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, IntPtr lParam); 并像这样使用它们: IntPtr lParam = Marshal.AllocCoTaskMem(Marshal.SizeOf(formatrange)); Marshal.StructureToPtr(formatrange, lParam, false); int returnValue = User32.SendMessage(_RichTextBox.Handle, ApiConstants.EM_FORMATRANGE, wParam, lParam); Marshal.FreeCoTaskMem(lParam); 而不是创建目标重载: [DllImport(“user32.dll”)] public static extern int SendMessage(IntPtr hWnd, int msg, int wParam, ref FORMATRANGE lParam); 使用它像: FORMATRANGE lParam = new FORMATRANGE(); int returnValue = […]