利用WH_CBT Hook将非模态对话框显示为模态对话框

WH_CBT监控有窗体的进程创建 很久很久以前搜到以前博客的一篇文章,一个项目要求是在Windows Server 2008 x64 R2下监控有窗体的cmd/powershell创建,当时采用了WH_CBT应用层消息拦截的方法来监控进程创建。 1 BOOL WINAPI SetHook(BOOL fInstall) { 2 3 BOOL fOk; 4 if (fInstall) 5 { 阅读详情

关键字:非模态、模态、Hook、WH_CBT、CBTProc、
  1、意图
  有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)?
  2、简单实现
  简单地说,模态窗口显示时,其父窗口是被Disable的,所以模态窗口才呈现“模态”,所以只要在显示我们非模态窗口前将父窗口Disable即可实现,如下:
  ……
  AfxGetMainWnd()->EnableWindow(FALSE);//将主窗口Disable,显示出的非模态窗口就变成模态的了
  ShowModelessWindow();
  ……
  问题在于非模态窗口显示之后是立即返回的,那我们将父窗口Enable的代码放在哪里呢?笨办法是用时钟,不断地检测显示出来的非模态窗口是否已经关闭,若关闭则将父窗口Enable。
  当然,还要更好的办法。
  3、WH_CBT Hook
  WH_CBT钩子的详细说明请参阅MSDN,我们仅仅需要知道的是在窗口创建、销毁之前系统都会调用挂上了WH_CBT的钩子函数,这正是我们需要的。具体就是在显示非模态窗口之前挂上我们的WH_CBT钩子处理函数,之后非模态窗口创建的句柄就可以在钩子函数的nCode为HCBT_CREATEWND(创建窗口)时从wParam参数获得,将其保存下来,并在钩子函数的nCode为HCBT_DESTROYWND(销毁窗口)时与wParam参数进行比较,如果匹配则恢复主窗口的Enable状态。
  2、实现
  1)首先定义两个变量,此处为全局静态变量。
  static HHOOK g_hHook = NULL;
  static HWND g_hWndDialog = NULL;//用以保存窗口句柄
  2)再添加一个函数CbtProc,由于是回调函数,注意要声明为static。
  static LRESULT CALLBACK CbtProc(int nCode, WPARAM wParam, LPARAM lParam);
  3)挂钩
  假设下面是我们的某个浏览器中调用“打印”对话框的函数
  void CMyHtmlView::OnFilePrint()
  {
  AfxGetMainWnd()->EnableWindow(FALSE);
  g_hWndDialog = 0; //可能多次调用,需要重置保存窗口句柄的变量
  g_hHook = SetWindowsHookEx(WH_CBT, CbtProc, NULL, GetCurrentThreadId());
  if (!g_hHook)
  {
  AfxGetMainWnd()->EnableWindow(TRUE);
  return;
  }
  调用“打印”对话框
  }
  LRESULT CALLBACK CMyHtmlView::CbtProc(int nCode, WPARAM wParam, LPARAM lParam)
  {
  switch (nCode)
  {
  case HCBT_CREATEWND:
  {
  HWND hWnd = (HWND)wParam;
  LPCBT_CREATEWND pcbt = (LPCBT_CREATEWND)lParam;
  LPCREATESTRUCT pcs = pcbt->lpcs;
  if ((DWORD)pcs->lpszClass == 0x00008002)//#32770,“打印”对话框类名
  {
  if ( g_hWndDialog == 0 )
  g_hWndDialog = hWnd; // 只保存一次保存“打印”窗口的句柄
  }
  break;
  }
  case HCBT_DESTROYWND:
  {
  HWND hwnd = (HWND)wParam;
  if (hwnd == g_hWndDialog)
  {
  AfxGetMainWnd()->EnableWindow(TRUE);//恢复窗口状态
  UnhookWindowsHookEx(g_hHook);//去除挂钩
  }
  break;
  }
  }
  return CallNextHookEx(g_hHook, nCode, wParam, lParam);
  }
  很简单吧,更重要的是这种方法确实有效。
  参考资料:
  MSDN:CBTProc

C# MessageBox按钮文字自定义:基于Windows Hook的本地化解决方案 在桌面应用开发中,本地化与UI定制是提升用户体验的关键环节。Windows操作系统通过消息机制管理窗口交互,而钩子技术允许开发者拦截并处理特定事件,为深度定制提供了可能。通过Win32 API的P/Invoke调用,C#程序能够突破托管封装的限制,直接与底层系统交互,实现高度灵活的界面控制。这一技术价值在于平衡了标准化与个性化需求,尤其适用于需要多语言支持或品牌定制的商业软件场景。本文聚焦于C# MessageBox按钮文字的自定义需求,利用CBT Hook在窗口创建阶段动态修改控件文本,为WinForms 阅读详情

相关推荐

Qt Tab Widget 实战:如何打造一个可动态增删的标签页管理器(附完整代码)

本文深入探讨了使用Qt框架中的Tab Widget控件构建动态标签页管理器的实战方法。通过分析动态增删的核心挑战,提供了完整的C++代码示例,涵盖信号槽机制、页面生命周期管理、上下文菜单实现以及状态持久化等关键功能,帮助开发者打造高效、用户友好的桌面应用界面。

bb456的博客 1042

令人头痛的WH_CBT钩子,使窗口前置——泪水+汗水的赞歌

一、工作中遇到一个问题: 1、需要让某个特定的窗口不被最小化、不被阻挡、不失去焦点(因为有输入); 2、由某个服务或进程来自动筛选和控制。 本来觉得用几个windows API就OK了,谁知道弄了好长好长的时间,崩溃了N次,直到现在..............依旧不敢100%确定,唉! 二、思路 1、FindWindow而后前置SetForegroundWindow ——总感觉似乎不妥

singshinesong的博客 1万+

海思MPP平台千兆以太网驱动集成与测试指南

千兆以太网(GE)是嵌入式视觉系统中音视频流传输与边缘控制的核心物理接口,其底层驱动需兼顾DMA高效调度、中断实时响应与PHY链路稳定性。在Linux嵌入式环境中,GE驱动通常基于net_device框架实现,并深度耦合于SoC专用媒体处理平台(如海思MPP),通过硬件抽象层(HAL)屏蔽寄存器操作,提供零拷贝、RGMII时序适配、描述符环管理等关键能力。技术价值体现在降低CPU负载、保障1080p@30fps实时推流、支持ONVIF/RTSP协议交互及固件远程升级。典型应用场景包括网络摄像机(IPC)、A

weixin_42599908的博客 89

WH_CBT Hook将非模态对话框显示为模态对话框

<br />关键字:非模态、模态、Hook、WH_CBT、CBTProc、<br /> <br />1、意图<br />有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)?<br /> <br />2、简单实现<br />简单地说,模态窗口显示时,其父窗口是被Disa

Xp275500976的专栏 1007

大模型在心律失常预测及治疗方案制定中的应用研究报告

目录一、引言1.1 研究背景与意义1.2 研究目的与方法1.3 研究创新点二、大模型技术概述2.1 大模型基本原理2.2 常见大模型类型及特点2.3 大模型在医疗领域的应用现状三、心律失常的术前预测与准备3.1 术前心律失常预测的重要性3.2 大模型在术前预测中的应用案例3.3 基于预测结果的术前准备方案四、术中监测与实时调整4.1 术中监测心律失常的方法与技术4.2 大模型辅助术中决策的机制4.3 实时调整手术方案的策略与实践五、术后恢复与并发症风险预测5.1 术后心律失常的监测与评估5.2 大模型预测术

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1595

ThingsKit物联网平台产品管理之物模型

物模型是ThingsKit物联网平台为产品定义的数据模型,用于描述产品的功能。本文介绍物模型相关概念和使用限制。

云腾五洲官方博客 1173

通过 Windows CBT 钩子 API 实现修改 MessageBox 阻塞式模态对话框按钮的显示文字

在开发 Windows 软件时,经常会调用MessageBox函数,它是一个极其常用的阻塞式消息模态对话框。然而,系统默认只提供“确定”、“取消”、“是”、“否”等标准文本。如果想实现自定义按钮的显示文本,比如把“确定”/“取消”按钮改为“好的”或“不好”,通常的方法是自己写一个窗体。 但通过 Windows 挂钩(Hook)技术,开发者可以“拦截入侵”系统标准的 MessageBox,在其显示前的瞬间完成“整容”。 本文作者:张赐荣,视障者,信息无障碍解决方案资深研发专家。

张赐荣的技术博客 406

QCM6490平台DDR测试:从QDUTT配置到眼图分析的实战指南

本文详细介绍了QCM6490平台DDR测试的全流程,从QDUTT工具安装配置到眼图分析,提供了实战操作指南和常见问题解决方案。通过具体案例分享,帮助工程师掌握DDR测试技巧,确保内存稳定性,特别适用于物联网和边缘计算设备的开发调试。

weixin_33910191的博客 456

将非模态对话框显示为模态对话框

<br />1、意图<br />有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)?<br />2、简单实现<br />简单地说,模态窗口显示时,其父窗口是被Disable的,所以模态窗口才呈现“模态”,所以只要在显示我们非模态窗口前将父窗口Disable即可实现,如

luheng2006的专栏 734

YOLO26涨点改进 | 全网独家复现、小目标检测改进篇 | TGRS 2025 | YOLO26引入MFAE-YOLO中的GFFP、FCPS 和 C3k2-FPEU创新点,涨点起飞,直接发论文

🔥本文给大家介绍在YOLO26中引入MFAE-YOLO中的 GFFP(全局特征融合处理)、FCPS(特征通道像素注意力) 和 C3k2-FPEU(特征池提取单元) 二次创新改进模块,能显著提升对小目标的检测性能。GFFP通过多尺度特征融合增强全局上下文感知能力,有效提升小目标在复杂背景下的可辨性;FCPS融合通道、像素和空间注意力机制,增强了模型对关键细节和小区域特征的关注,提升检测精度;C2F-FPEU利用多种池化方式挖掘细节特征,优化浅层特征表示能力。三者协同提升了YOLO26在小目标检测中的鲁棒性。

Ai缝合怪、助力小伙伴高效发论文 304

华为校招&实习&留学生机试真题目录+算法分类+在线OJ+通过率+视频讲解

全网最新最全华为校招&实习&留学生机试真题题库

m0_73659489的博客 6863

让非模态对话框像模态对话框一样,没有处理完就不能选择其他的对话框

 1、意图 有时候我们希望将非模态窗口显示为模态窗口。比如在IE的“文件”菜单下选择“打印”,弹出的“打印”对话框就是非模态的(也许我们不太清楚Microsoft的设计意图,一般来说这里的“打印”对话框应该是模态的)。这种情况下如何将“打印”对话框显示为模态的呢(这个对话框对我们来说是Black Box)? 2、简单实现 简单地说,模态窗口显示时,其父窗口是被Disable的,所以模态

tianyu030963的专栏 641

STM32F103C8T6驱动DHT11温湿度传感器程序

本程序基于 STM32F103C8T6 微控制器,通过 GPIO 模拟单总线通信时序实现对 DHT11 温湿度传感器的数据采集,主机采用拉低数据线的方式触发传感器启动,并通过检测高电平持续时间区分逻辑“0”和“1”,依次读取湿度和温度的整数数据及校验位,经过校验后将有效结果存入缓存数组,实现对环境温湿度的周期性测量与处理。

加斯顿工程师的博客 200

自定义MessageBox----HOOK

HOOK自己接触的其实非常少,所以也从来没敢谈论过什么,这个MessageBox还真的研究了好几个hour呢,挺怕被大牛们嘲笑的,今天我也不要脸了,说说我的一些看法,欢迎扔砖头,西红柿。 众所周知,一个标准的messagebox框通常不是自定义风格的,因为我们从来不能正常找到它的

yiruirui0507的专栏 6267

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

C# MessageBox按钮文字自定义:Windows API Hook技术实战

在Windows桌面应用开发中,对话框是用户交互的核心组件之一。系统提供的标准MessageBox虽然便捷,但其按钮文本固定,难以满足个性化、国际化或特定业务场景的需求。其底层原理基于Windows API的通用对话框机制,由操作系统统一绘制和管理。为了突破这一限制,开发者需要借助Hook(钩子)技术,在窗口创建的关键生命周期阶段进行拦截和修改。这项技术的核心价值在于,它允许我们在不重写整个对话框、不引入第三方库的前提下,以最小侵入性实现对系统组件的精准定制,从而在保持原生体验的同时,极大地提升了用户界面的

weixin_33806914的博客 427

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

自动的关闭对话框 MessageBox

// #include #include #include /********************************/ // Code By /********************************/ HHOOK hook=NULL; int MSGRET=0; int k=0; HWND MSGHWND,TEXTHWND; UINT TD; void CA

记事本 1074

C# Hook技术实战:动态修改MessageBox按钮文字

在Windows桌面应用开发中,系统对话框是常见的用户交互组件,但其默认行为往往无法满足定制化需求。通过Windows API Hook技术,开发者可以在不重写原生组件的前提下,深入系统消息处理流程,实现对标准控件行为的动态拦截与修改。这一技术原理基于事件驱动的回调机制,允许在窗口创建、激活等关键生命周期节点注入自定义逻辑,具有极高的灵活性和系统兼容性。其技术价值在于以最小侵入性实现深度定制,平衡了开发效率与用户体验。在C#开发场景中,结合P/Invoke平台调用,可安全稳定地应用于**系统对话框定制**、

weixin_30325971的博客 293

CreateDialog Function

CreateDialog Function发送反馈CreateDialog 宏从一个对话框模板资源创建一个非模态对话框,CreateDialog 宏使用 CreateDialogParam 函数语法以带有颜色区分的格式查看复制到剪贴板打印HWND CreateDialog( __in HINSTANCE hInstance, __in LPCTSTR lpTemplate, __in HWND hWndParent, __in DLGPROC lpDialogFunc );

x_studying的专栏 1060

个人觉的不错的文章[来自优快云]

API Hooking Revealed 19日 mynote 〖0〗-->利用WH_CBT Hook将非模态对话框显示为模态对话框 19日 mynote 〖0〗-->與作業系統掛勾-Hook寫作 19日 mynote 〖0〗-->Win2K下的Api函数的拦截 19日 mynote 〖0〗-->在32位程序中如何实现进程间通讯 19日 mynote 〖0〗-->Windows 95进程间数据通讯

小发猫 1817
上一篇: 利用鼠标键盘钩子截获密码
下一篇: 安装Dark GDK后无法在VS2008中使用其Wizards的解决办法
itclock
博客等级 码龄25年 19粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值