|
源代码网推荐
在我的代码中,我在尝试进行数据库连接之前,检查值是否为 NO_ERROR(可以将其更为确定地描述为 SUCCESS)。如果该 API 调用返回 NO_ERROR,但数据库连接失败,则我使用 ConfirmCredentials 调用通知凭据系统这些凭据无效,因而不应该保留。如果数据库连接成功,则我使用 ConfirmCredentials 调用通知凭据系统该用户 ID 和密码组合有效,并且应该保留。
Dim connString As String Dim password, userid As String Dim selectAuthors As String = _ "Select au_id, au_lname, au_fname From authors" If result = CredUIReturnCodes.NO_ERROR Then connString = String.Format( _ "Password={1};User ID={0};" & _ "Initial Catalog=pubs;" & _ "Data Source=MyServer", _ userid, password) Dim conn As New SqlConnection(connString) Try conn.Open() CredUI.ConfirmCredentials(host, True) Catch sqlEx As SqlException If sqlEx.Number = 18456 Then MsgBox("Authentication Failed") CredUI.ConfirmCredentials(host, False) End If Catch ex As Exception MsgBox("Connection Error") CredUI.ConfirmCredentials(host, False) End Try If conn.State = ConnectionState.Open Then Dim cmdAuthors As New SqlCommand( _ selectAuthors, _ conn) Dim daAuthors As New SqlDataAdapter(cmdAuthors) Dim dtAuthors As New DataTable("Authors") daAuthors.Fill(dtAuthors) retrievedData.SetDataBinding(dtAuthors.DefaultView, "") End If ElseIf result <> CredUIReturnCodes.ERROR_CANCELLED Then MsgBox("There was an error in authentication") End If
使用自己的图形
凭据对话框已经相当漂亮了(参见图 2),它非常不错并且“一致”,但如果您希望使其更个性化一点,我也能够理解。您很幸运,您可以通过 PromptForCredentials API 提供自己的 320x60 图形(参见图 3),以取代默认图像。

图 3. 向标准凭据对话框中添加了自定义图形。
在您自己的代码中完成该操作相当容易,因为 System.Drawing.Bitmap 类提供了一个便利的方法 GetHbitmap 来获取基础图形的本机句柄。您需要创建 System.Drawing.Bitmap 的实例,然后将 CREDUI_INFO 结构的 .hbmBanner 成员设置为该位图的本机句柄。在使用完该 CREDUI_INFO 结构(已经对 PromptForCredentials 进行了调用)之后,需要释放该本机句柄,以避免任何形式的内存泄漏。要释放该句柄,需要使用另一个 API 调用,即 DeleteObject。我已经在我的 CredUI 类中包含了该 API 调用,以使自定义位图的使用变得尽可能地容易。
Dim credBmp As New Bitmap("d:credui.bmp") Dim info As New CREDUI_INFO() With info .hwndParent = Me.Handle .pszCaptionText = host .pszMessageText = _ String.Format("Please Enter Credentials for {0}", host) .hbmBanner = credBmp.GetHbitmap() End With "make call to PromptForCredentials "... CredUI.DeleteObject(info.hbmBanner) 为了与 Windows 保持一致,建议您仍然使用默认图形,但能够在需要的时候自定义对话框也很不错。我从示例代码中的一个文件中加载了该图像,但如果您有这方面的爱好,也可以使用 GDI+ 临时绘制该图像。
小结
如果您需要提示用户输入数据库凭据、网站凭据或任何其他凭据组,则完成该任务的最佳方式是使用内置的操作系统功能。除了为用户提供一致的用户界面以外,您还可以因为操作系统缓存与已登录用户关联的凭据而受益
源代码网供稿. |