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

Problem Using user32.dll in C# (Error 1008 An attempt was made to reference a token that does not exist.)

你好传奇程序员。

流经我的 我尝试在 windows 通用应用程序中使用 user32.dll (UWP)C# 语言,但我在尝试使用从 .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() 方法,并在按钮的事件侦听器中使用了它。 Images 是一个 Dictionary<string,string> 并且每件事都是 Fine 除非调用方法 LockWorkStation() 它总是 return false所以抛出的错误是 1008 我在 Title 中提到了它问题是 Why?how can I assign a token ?

Note: any way,any way to lock the screen is admirable.

所以在搜索了很多并且无法直接从通用 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;
               }

Web 服务器中有代码:


        [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
但是:您必须安装网络服务器并授予用户访问权限。