2013-10-31 103 views
0

我在进程上使用waitFor命令时遇到了问题。我的代码是这样的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”的退出值验证和程序插入语句到我的数据库。我希望进程等待用户成功通过身份验证,然后将我的数据插入数据库。我已经搜索了很多,但没有取得任何成功。我应该使用不同的过程来锁定屏幕吗?

+1

您是否尝试在命令行中添加'/ wait'参数? – Maroun

+0

如果只检查一次! –

+2

@PhilippSander这有什么问题? 'waitFor()'应该等待进程完成。 – Maroun

回答

0

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

+0

我明白了,你知道还有其他的工作吗?我基本上锁定了屏幕,因为程序检测到了键盘使用中的一些差异。解锁可确保使用桌面的用户是实际的“经过身份验证的用户”。所以我想在用户解锁工作站后执行'insert语句'。谢谢! – RNP

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()

+0

有执行前,但错过了它,而张贴在这里。抱歉。它不包括执行包括 – RNP

+0

你可以downvote这个? – RNP

+1

上面的代码提供了使线程等待进程完成的正确方法。你现在在你的问题描述中有正确的。如果它还早,这个问题就出现在其他地方(不是在java代码中),可能是你用来锁定屏幕的命令。 (注意:我不熟悉命令是如何工作的:/) – cmd