我试图设置ReadFile为异步运行,根据MSDN,我需要设置lpNumberOfBytesRead为null:
"如果这是一个异步操作,请为此参数使用NULL,以避免可能出现的错误结果."
例如,如果我有以下内容:
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool ReadFile(
IntPtr hFile,
out byte[] aBuffer,
int cbToRead,
IntPtr cbThatWereRead,
ref OVERLAPPED pOverlapped
);
Run Code Online (Sandbox Code Playgroud)
我这样称呼它(意图使第4个参数为null):
Win32API.ReadFile(readHandle, out data_read, Win32API.BUFFER_SIZE, IntPtr.Zero, ref over_lapped);
Run Code Online (Sandbox Code Playgroud)
是否与使用null调用它相同?如果没有,我应该在声明或函数调用本身中更改什么?
我也好奇,如果我应该使用SafeHandle或HandleRef代替IntPtr的hFile参考?我知道CloseHandle(IntPtr)当我完成它时确保关闭手柄,只是不确定是否有任何其他理由使用其他两个选项IntPtr.我也在努力避免使用不安全的代码.
编辑:事实证明,我不应该设置第四个参数IntPtr.Zero,因为即使我异步运行,它仍然可以立即返回.见异步磁盘I/O.啊,我喜欢自相矛盾的故事.
我想在我的C#程序中使用此功能:当用户在任何地方执行Ctrl+ C或复制时(即当剪贴板内容发生更改时),我的程序将收到通知,并检查内容是否符合某些条件,如果是,则成为活动程序,处理内容等
我可以从中获取内容System.Windows.Forms.Clipboard,但是,我不知道如何从剪贴板监视内容更改.
如果使用Windows Vista或更高版本,请使用AddClipboardFormatListenerJohn Knoeller的答案,对于Windows XP,我必须使用较旧的,更脆弱的SetClipboardViewerAPI,如接受的答案.
我知道如何将内容放入剪贴板并从剪贴板中检索内容.
但是,在这两个操作之间,另一个操作可能会更改剪贴板的内容.
有没有办法在任何应用程序修改剪贴板时收到通知?
如何在WPF应用程序运行时禁用"打印屏幕"功能?
用例是我的客户希望避免不必要地复制来自外部世界的有价值的以患者为中心的数据,并且它们提供物理安全性以防止人们通过非数字手段获取数据.
我有一个应用程序,作为托盘图标坐在系统托盘中.我已经注册了一个热键,当按下它时将捕获任何应用程序中的当前文本选择,即使在Web浏览器中也是如此.
我的方法是发送密钥组合{Ctlr + C}来复制文本.然后访问剪贴板并使用我自己的应用程序中的文本.
我在VB.NET中编程,但是在C#中的任何帮助,甚至是使用Win32_Api的C++都会受到高度赞赏.
我使用AutoHotkey,在那里,我有一个访问剪贴板文本的脚本,工作正常.
Pause::
clipboard = ; Start off empty to allow ClipWait to detect when the text has arrived.
Send ^c
ClipWait, 2 ; Wait for the clipboard to contain text.
if ErrorLevel
{
;Do nothing after 2 seconds timeout
return
}
Run https://translate.google.com/#auto/es/%clipboard%
return
Run Code Online (Sandbox Code Playgroud)
由于AutoHotkey是开源的,我下载了代码并尝试尽可能多地复制ClipWait的行为.
我的代码大多数时间都在工作,但有时会有一个重要的延迟.我无法访问剪贴板和win32函数IsClipboardFormatAvailable()为While保持返回False.当我尝试从可编辑的TextBox中专门从Google Chrome复制时,会发生这种情况.
我尝试了很多不同的东西,包括使用.Net Framework剪贴板类.我读到的问题可能是运行命令的线程没有设置为STA,所以我做到了.在我的绝望中,我也放了一个计时器,但没有完全解决问题.
我也读了一个钩子监视剪贴板的选项,但我想避免这种情况,除非它是唯一的方法.
这是我的VB.NET代码:
Imports System.Runtime.InteropServices
Imports System.Text
Imports System.Threading
Imports Hotkeys
Public Class Form1
Public m_HotKey As Keys = Keys.F6
Private Sub RegisterHotkeys() …Run Code Online (Sandbox Code Playgroud) 我在使用此链接上的"Catch Clipboard Events代码"时遇到问题:
只有当表单停留在前台时,代码才能生效,而不是最小化到托盘但是:如果你添加一个notifyicon并将表单最小化到托盘并将showintaskbar变为false(这样你在托盘中只有一个图标),程序不会再抓住任何剪贴板更改...即使你最大化表单,它也不会再工作...你必须重新启动程序..
关于如何解决这个问题的任何想法!即使表格最小化到托盘中,我怎样才能捕捉到剪贴板的变化!
任何帮助真的很感激......
谢谢
我目前有一个C#winforms应用程序,Ctrl + C和Ctrl + V绑定为编辑主菜单上的键盘快捷键.代码中有一些自定义复制/粘贴行为,它们响应这些菜单项,例如复制和粘贴listviews中的行.
但是,我的问题是您可以编辑行内的文本,当您这样做时,我希望Ctrl + C和Ctrl + V不会触发编辑菜单命令,而应该默认为基于正常文本的复制/粘贴.
我尝试过的一件事是触发BeforeLabelEdit和AfterLabelEdit事件,并从那里手动禁用/重新启用菜单项.不幸的是,似乎禁用的菜单项上的键盘快捷键仍会触发menu_Popup事件,该事件当前用于决定应启用/禁用哪些菜单项.(例如,"粘贴"仅在剪贴板上有文本时才有效).因此,即使禁用菜单项,键盘快捷键仍将激活Popup事件,这将重新启用菜单项.(这是一个错误吗?)
我找不到任何临时禁用菜单项键盘快捷方式的方法,无需手动存储旧快捷方式,将快捷方式设置为null,然后在需要重新启用时感觉脏(但感觉很脏).
当然要覆盖复制/粘贴行为或添加它,这是常见的事情吗?这里有更好的模式吗?
我很好奇是否可以编写一个程序来监控我的文本选择.一种可能的用法是编写编辑器/ IDE不可知代码格式化程序:
- >我很乐意这么做...
我需要帮助在循环中不断检查剪贴板或复制文本.基本上我有一个粘贴按钮,但我只想在我将文本复制到剪贴板时启用它,并在我没有复制任何文本时禁用它.我知道我必须使用:
Clipboard.ContainsText
Run Code Online (Sandbox Code Playgroud)
检查我是否有文本复制到我的剪贴板,但我需要帮助制作循环或东西总是检查.
谢谢.
bool hasCopiedArtikelnum = false;
while (hasCopiedArtikelnum == false)
{
try
{
artikelnum = Clipboard.GetText();
hasCopiedArtikelnum = true;
}
catch {}
}
Run Code Online (Sandbox Code Playgroud)
我希望程序保持循环,直到他成功复制.将其他东西放入"尝试"工作吗?或者程序还会>>尝试<<将hasCopiedArtikelnum设置为true?
c# ×10
clipboard ×6
c++ ×2
windows ×2
winforms ×2
wpf ×2
.net ×1
asynchronous ×1
button ×1
copy ×1
copy-paste ×1
events ×1
file-io ×1
loops ×1
notifyicon ×1
printscreen ×1
sendkeys ×1
vb.net ×1
winapi ×1