0

在进程上使用 waitFor 命令时遇到问题。我的代码是这样的

//preconditions
try{
  // lock the work station
  Process p= Runtime.getRuntime().exec("C:\\Windows\\System32\\rundll32.exe user32.dll,LockWorkStation");
  int exitval=p.waitFor();
  // If the authentication is successful
  if(exitval==0)
  {
     //statements to insert into database 
  }
}
catch(IOException e)
{
   e.printStackTrace();
}
catch (InterruptedException e) {
   e.printStackTrace();
}

该过程很好地锁定了屏幕,但它在用户真正能够使用退出值“0”进行身份验证之前退出,并且程序正在将语句插入我的数据库中。我希望该过程等到用户成功通过身份验证,然后将我的数据插入数据库。我已经用谷歌搜索了很多没有任何成功。我应该使用不同的过程来锁定屏幕吗?

4

2 回答 2

2

在执行时正在调用以下内容LockWorkStation。请注意,它是异步执行的

BOOL WINAPI LockWorkStation(void);
If the function succeeds, the return value is nonzero. Because the function executes asynchronously, 
a nonzero return value indicates that the operation has been initiated. It does not indicate whether 
the workstation has been successfully locked.

此外,在您上面的代码中,您需要执行该过程。

在您提出的问题中,更改:

Process p= Runtime.getRuntime().("C:\\Windows\\System32\\rundll32.exe user32.dll,LockWorkStation");
int exit = p.waitFor();

Process p= Runtime.getRuntime().exec("C:\\Windows\\System32\\rundll32.exe user32.dll,LockWorkStation");
int exit = p.waitFor();

此外,您可能想考虑使用ProcessBuilder而不是 Runtime.exec()

于 2013-10-31T12:09:35.610 回答
0

LockWorkStation是一个异步函数。它总是会立即返回,而不是等待解锁。从控制台运行C:\Windows\System32\rundll32.exe user32.dll,LockWorkStation时,您甚至可能会在屏幕锁定前不久看到下一个命令提示符。换句话说,这与 Java 和Process.waitFor().

于 2013-10-31T14:13:54.723 回答