我使用IShellLink接口在桌面上创建了一个快捷方式(.lnk)文件,类似于本页底部描述的代码.
所以我的假设是删除这个快捷方式我可以简单地在.lnk文件上调用DeleteFile,但显然它是不够的...如果我这样做,我得到一个看起来像这样的快捷方式文件的残余:

但有趣的是,如果我浏览桌面文件夹中的文件,比如使用Windows资源管理器,那么.lnk文件实际上并不存在.我看到的是桌面GUI界面上的一些工件.
知道如何删除快捷方式(微软想要它的方式吗?)
我正在尝试使用以下代码从我的服务应用程序运行用户模式进程(作为local system.)
用户模式进程的要求是在没有提升的情况下运行,但UIAccess="true"在其清单中必须能够在 Windows 8 下正确显示top-most窗口。
所以我这样做(从我的服务)来运行我的用户模式进程:
//NOTE: Error checking is omitted for readability
//'dwSessionID' = user session ID to run user-mode process in
//'pUserProcPath' = L"C:\\Program Files (x86)\\Company\\Software\\user_process.exe"
HANDLE hToken = NULL;
WTSQueryUserToken(dwSessionID, &hToken);
HANDLE hToken2;
DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hToken2);
LPVOID pEnvBlock = NULL;
CreateEnvironmentBlock(&pEnvBlock, hToken2, FALSE);
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.lpDesktop = L"winsta0\\default";
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
//ImpersonateLoggedOnUser(hToken2); //Not necessary …Run Code Online (Sandbox Code Playgroud) 我正在使用GetOpenFileName API,或者在我的情况下使用MFC的CFileDialog来打开文件,就像它在这里显示的那样(除了单个文件选择 - 即我提供了我自己的更长缓冲区m_ofn.lpstrFile.)
它工作正常,除非用户选择路径长度超过MAX_PATH - 1(或259)个字符的文件.在这种情况下会发生以下情况:
在我的Windows 8.1上,它将用户选择的路径转换为古老的8.3短文件格式: "C:\TESTDE~1\NEWFOL~1"
在Windows XP上,我甚至无法选择任何内容,我得到了这个:

所以我很好奇,因为操作系统本身支持长Unicode路径,前缀\\?\(包括XP)是否有任何方法可以哄骗GetOpenFileName返回该格式的路径,而不受259个字符的限制?
为了测试我的应用程序(检测当前的CPU使用率),我需要在CPU上设置一个人工工作负载,例如:10%,20%,30%等,最高可达100%.有没有办法做到这一点?
我将注入的内容脚本中的消息发送回Chrome扩展程序中的后台脚本,如下所示:
chrome.runtime.sendMessage({action: "myResult"});
Run Code Online (Sandbox Code Playgroud)
这很好,直到我重新加载我的扩展(通过转到设置 - >扩展 - >"重新加载(Ctrl + R)"为我的扩展.)
反过来,当我的后台脚本启动时,它反复调用chrome.tabs.executeScript所有打开的选项卡以编程方式重新注入我的内容脚本(正如我在这个问题中所示).
但是在我这样做之后,如果我sendMessage从我的内容脚本中调用第一行,它会抛出此异常:
错误:连接到扩展名my_extension_id时出错
知道为什么会这样吗?
javascript google-chrome google-chrome-extension content-script
我正在编写一个 Google Chrome 扩展程序,其中嵌入了 YouTube 视频:
<iframe id="ytplayer" type="text/html" width="640" height="360"
src="https://www.youtube.com/embed/M7lc1UVf-VE"
frameborder="0" allowfullscreen>
Run Code Online (Sandbox Code Playgroud)
然后,我在下面添加了一个按钮,允许用户单击以全屏播放该视频:
<a href="#" id="lnkFullScreen">Play full screen</a>
Run Code Online (Sandbox Code Playgroud)
这项工作是通过 JavaScript(和 jQuery)使用我在这里找到的代码完成的:
$("#lnkFullScreen").click(function(e)
{
e.stopPropagation();
e.preventDefault();
var playerElement = document.getElementById("ytplayer");
playerElement.playVideo(); //`playVideo` is undefined
var requestFullScreen = playerElement.requestFullScreen || playerElement.mozRequestFullScreen || playerElement.webkitRequestFullScreen;
if (requestFullScreen)
{
requestFullScreen.bind(playerElement)();
}
});
Run Code Online (Sandbox Code Playgroud)
但是当我运行这段代码时,该playVideo函数undefined适用于playerElement.
知道我做错了什么吗?
附言。我希望我的播放器保留 HTML5。
javascript youtube google-chrome youtube-api google-chrome-extension
比方说,如果我使用CreateProcess或CreateProcessAsUser API 创建进程,这是否意味着无论我的主机进程在哪个上下文中运行(低权限用户,内置Guest等),调用TerminateProcess(PROCESS_INFORMATION.hProcess)将始终终止该进程?
出于安全原因,我的应用程序的 UI 模块以high 强制完整性级别运行。除了一件事之外,其中的所有内容都运行良好。为了与旧版本兼容,我需要能够让用户向 UI 模块发出命令行调用。
目前该机制的工作原理如下:
Windows 资源管理器中的快捷方式调用我的模块,如下所示:
path-to-module\module.exe -op="a, s, r"
Run Code Online (Sandbox Code Playgroud)当进程解析此命令行时,它会使用FindWindow通过其唯一的类名来module.exe定位正在运行的 UI 模块副本(或自身的另一个副本) 。然后,它使用PostMessage API 向其发送注册消息。
然后,正在运行的 UI 模块(具有high完整性级别)在收到消息时会相应地对其进行处理。
问题在于,由于UI模块的运行副本具有high完整性级别,因此它无法接收来自较低完整性级别的消息,或者当Windows资源管理器运行该模块的副本以解析快捷方式命令时,它无法接收来自较低完整性级别的消息,这使得它以medium完整性级别运行等级。
为了解决这个问题,我找到了这个UIAccess标志(请参阅此处,然后向下滚动到“ UIAccess for UI Automation applications ”。)
所以我的假设是,如果我设置此标志并对我的 UI 模块进行代码签名:
它将能够绕过我上面描述的 UIPI 限制。
它运行得很好:
但我看到的是,PostMessage当我从以完整性级别运行的模块调用它时,我上面描述的算法中的 API 仍然失败,并显示 ERROR_ACCESS_DENIED medium。
我在那里错过了什么?
我的目标是确定打印机的当前状态。我找到了以下代码。这是一个稍微修改的版本,用于修复内存泄漏和错误:
#include <Winspool.h>
int GetPrinterStatus( char* szPrnName )
{
HANDLE hHandle = 0; // Handle of the printer
DWORD dwStatus = 0; // Printer status we should receive
DWORD dwSize = 0; // Size of memory we should
// allocate for PRINTER_INFO_2
PRINTER_INFO_2* pPrnInfo2 = 0; // Structure specifies detailed
// printer information
DEVMODE DevMode = {0}; // Structure contains information
// about the device initialization
// and environment of a printer
PRINTER_DEFAULTS PrnDef = { 0, &DevMode, …Run Code Online (Sandbox Code Playgroud) 我刚刚下载了Visual Studio 2017并用它转换了我的基于对话框的 C++/MFC 项目(来自 Visual Studio 2008 SP1。)但是当我去Resources它时显示这个错误:
致命错误 RC1015:无法打开包含文件“winres.h”
以及如何解决这个问题?