在 C# 中使用 user32.dll 时出现问题(错误 1008 尝试引用不存在的令牌。)

Posted

技术标签:

【中文标题】在 C# 中使用 user32.dll 时出现问题(错误 1008 尝试引用不存在的令牌。)【英文标题】:Problem Using user32.dll in C# (Error 1008 An attempt was made to reference a token that does not exist.) 【发布时间】:2020-01-04 08:46:51 【问题描述】:

你好传奇的编码员。

流经我的previous question 我尝试在 C# 语言的 Windows 通用应用程序 (UWP) 中使用user32.dll,但在尝试使用我从那个 .dll

导入的方法

这是我的代码:

[DllImport("user32.dll")]
public static extern bool LockWorkStation();
private async void btnLock_Click(object sender, RoutedEventArgs e)

    string path;
    if (Images.TryGetValue(selectedRadioButton.Name, out path))
    
        StorageFile file = await StorageFile.GetFileFromPathAsync(path);
        await LockScreen.SetImageFileAsync(file);
        if (!LockWorkStation())
            throw new Exception(Marshal.GetLastWin32Error().ToString());
    

如您所见,我从user32.dll 导入了LockWorkStation() mthod,并在按钮的事件侦听器中使用了它。 ImagesDictionary<string,string> 并且一切都Fine 除非调用方法 LockWorkStation() 它总是返回 false 并且抛出的错误是 1008 我在 中提到过标题问题是为什么?我如何分配令牌?

注意:任何方式,任何方式锁定屏幕都是令人钦佩的。

【问题讨论】:

不,UWP 应用无法使用该功能。它在可以检测此类违规行为的沙箱中运行,这可能是“无效令牌”错误的来源。 我可以使用服务来调用它还是目标机器上的 Web 服务器。 @HansPassant 尝试设置最后一个错误为真然后得到窗口错误:pinvoke.net/default.aspx/user32.LockWorkStation 我试过它返回 5 我认为这意味着(访问被拒绝)@jdweng​​span> 是的,访问被拒绝。搜索“window lock screen access denied” 【参考方案1】:

所以在搜索了很多并且无法从通用 Windows 应用程序平台直接锁定屏幕后,我向本地 Web 服务器发送了一个 Web 请求,并让该 Web 服务器使用 user32.dll 并锁定屏幕。

这是 UWP 应用中的代码:

       try
               
                   HttpClient httpClient = new HttpClient();
                   Uri uri = new Uri("http://localhost:8080/lock/");

                   HttpStringContent content = new HttpStringContent(
                       " \"pass\": \"theMorteza@1378App\" ",
                       UnicodeEncoding.Utf8,
                       "application/json");

                   HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(
                       uri,
                       content);

                   httpResponseMessage.EnsureSuccessStatusCode();
               
               catch (Exception ex)
               
                   throw ex;
               

并且在网络服务器中有代码:


        [DllImport("user32.dll")]
        public static extern bool LockWorkStation();
        private static string LockTheScreen(HttpListenerRequest request)
        
            var inputStream = request.InputStream;
            try
            

                using (StreamReader sr = new StreamReader(inputStream))
                
                    JToken pass = JToken.Parse(sr.ReadToEnd());
                    if (pass.Value<string>("pass") == "theMorteza@1378App")
                    
                        LockWorkStation();
                    
                
            
            catch (Exception)
            

                return "fail";
            
            return "fail";
        

注意:您可以找到如何制作简单的网络服务器here但是:您必须安装网络服务器并授予用户访问权限。

【讨论】:

以上是关于在 C# 中使用 user32.dll 时出现问题(错误 1008 尝试引用不存在的令牌。)的主要内容,如果未能解决你的问题,请参考以下文章

如何从 javascript 调用 user32.dll 方法

在advapi32.dll DLL导入中使用LogonUser()时出现“指定的网络名称不再可用”错误

使用 user32.dll 从外部应用程序的文本框(Unicode)中提取文本到 C# 应用程序中

使用托管 C++ 库时出现 WS2_32.dll_unloaded 异常

如何在 c# 中使用 user32.dll 从类“ThunderRT6ListBox”的窗口中检索值

制作替换系统库中的函数调用的 DLL 时出现问题