Hi there,
I need to show the UAC shield in a RadButton. How can I achieve it?
We have an application which raise another process instance to a high privilege level under UAC and when the SO uses UAC (Windows Vista ou higher) I need to show the UAC shield in some buttons.
You can find the demo application here: http://support.microsoft.com/kb/981778?wa=wsignin1.0.
Please, tell me that it's doable otherwise I'll need to do the ugliest workaround of my life.
Thanks,
Tiago
I need to show the UAC shield in a RadButton. How can I achieve it?
We have an application which raise another process instance to a high privilege level under UAC and when the SO uses UAC (Windows Vista ou higher) I need to show the UAC shield in some buttons.
You can find the demo application here: http://support.microsoft.com/kb/981778?wa=wsignin1.0.
Please, tell me that it's doable otherwise I'll need to do the ugliest workaround of my life.
Thanks,
Tiago
7 Answers, 1 is accepted
0

Tiago
Top achievements
Rank 2
answered on 11 Feb 2015, 04:08 PM
Hi,
One more comment... I believe just setting the FlatStyle property to System may solve my issue.
btnTelerik.FlatStyle = FlatStyle.System;
Thanks,
One more comment... I believe just setting the FlatStyle property to System may solve my issue.
btnTelerik.FlatStyle = FlatStyle.System;
Thanks,
0
Hello Tiago,
Thank you for writing.
The possible solution that I can suggest is to create a bitmap from the UAC shield and assign it to the RadButton.Image property. You can find a sample implementation on the following link: http://stackoverflow.com/questions/13758458/add-a-uac-shield-to-a-button-and-retain-its-background-image
I am pasting the code snippet here as well in order the community to benefit from it:
I hope this information helps. Should you have further questions, I would be glad to help.
Regards,
Dess
Telerik
Thank you for writing.
The possible solution that I can suggest is to create a bitmap from the UAC shield and assign it to the RadButton.Image property. You can find a sample implementation on the following link: http://stackoverflow.com/questions/13758458/add-a-uac-shield-to-a-button-and-retain-its-background-image
I am pasting the code snippet here as well in order the community to benefit from it:
private
void
Form1_Load(
object
sender, EventArgs e)
{
Bitmap shield = GetUacShieldImage();
this
.radButton1.Image = shield;
this
.radButton1.Padding =
new
Padding(10, 0, 0, 0);
}
[DllImport(
"user32.dll"
)]
public
static
extern
int
SendMessage(IntPtr hWnd,
uint
Msg,
int
wParam,
int
lParam);
// Make the button display the UAC shield.
public
static
void
AddShieldToButton(Button btn)
{
const
Int32 BCM_SETSHIELD = 0x160C;
// Give the button the flat style and make it display the UAC shield.
btn.FlatStyle = System.Windows.Forms.FlatStyle.System;
SendMessage(btn.Handle, BCM_SETSHIELD, 0, 1);
}
// Return a bitmap containing the UAC shield.
private
static
Bitmap shield_bm =
null
;
public
static
Bitmap GetUacShieldImage()
{
if
(shield_bm !=
null
)
return
shield_bm;
const
int
WID = 50;
const
int
HGT = 50;
const
int
MARGIN = 4;
// Make the button. For some reason, it must
// have text or the UAC shield won't appear.
Button btn =
new
Button();
btn.Text =
" "
;
btn.Size =
new
Size(WID, HGT);
AddShieldToButton(btn);
// Draw the button onto a bitmap.
Bitmap bm =
new
Bitmap(WID, HGT);
btn.Refresh();
btn.DrawToBitmap(bm,
new
Rectangle(0, 0, WID, HGT));
// Find the part containing the shield.
int
min_x = WID, max_x = 0, min_y = HGT, max_y = 0;
// Fill on the left.
for
(
int
y = MARGIN; y < HGT - MARGIN; y++)
{
// Get the leftmost pixel's color.
Color target_color = bm.GetPixel(MARGIN, y);
// Fill in with this color as long as we see the target.
for
(
int
x = MARGIN; x < WID - MARGIN; x++)
{
// See if this pixel is part of the shield.
if
(bm.GetPixel(x, y).Equals(target_color))
{
// It's not part of the shield.
// Clear the pixel.
bm.SetPixel(x, y, Color.Transparent);
}
else
{
// It's part of the shield.
if
(min_y > y)
min_y = y;
if
(min_x > x)
min_x = x;
if
(max_y < y)
max_y = y;
if
(max_x < x)
max_x = x;
}
}
}
// Clip out the shield part.
int
shield_wid = max_x - min_x + 1;
int
shield_hgt = max_y - min_y + 1;
shield_bm =
new
Bitmap(shield_wid, shield_hgt);
Graphics shield_gr = Graphics.FromImage(shield_bm);
shield_gr.DrawImage(bm, 0, 0,
new
Rectangle(min_x, min_y, shield_wid, shield_hgt),
GraphicsUnit.Pixel);
// Return the shield.
return
shield_bm;
}
I hope this information helps. Should you have further questions, I would be glad to help.
Regards,
Dess
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
0

Tiago
Top achievements
Rank 2
answered on 12 Feb 2015, 01:06 PM
Hi Dess,
Thank you for your prompt support.
We need to change one line to get the code working properly:
Best regards,
Tiago Moura
Thank you for your prompt support.
We need to change one line to get the code working properly:
SendMessage(btn.Handle, BCM_SETSHIELD, 0, (IntPtr)1);
Best regards,
Tiago Moura
0
Hello Tiago,
Thank you for writing back.
When I modify the provided code snippet from my previous post to use the code you provided
I am unable to build my project as the SendMessage requires integer for the last parameter:
"Error message - The best overloaded method match for 'SendMessage(System.IntPtr, uint, int, int)' has some invalid arguments".
I hope this information helps. If you have any additional questions, please let me know.
Regards,
Dess
Telerik
Thank you for writing back.
When I modify the provided code snippet from my previous post to use the code you provided
SendMessage(btn.Handle, BCM_SETSHIELD, 0, (IntPtr)1);
I am unable to build my project as the SendMessage requires integer for the last parameter:
"Error message - The best overloaded method match for 'SendMessage(System.IntPtr, uint, int, int)' has some invalid arguments".
I hope this information helps. If you have any additional questions, please let me know.
Regards,
Dess
Telerik
Check out the Telerik Platform - the only platform that combines a rich set of UI tools with powerful cloud services to develop web, hybrid and native mobile apps.
0

Lex
Top achievements
Rank 1
answered on 03 Oct 2015, 03:25 AM
The SendMessage signature can vary, such as
public static extern uint SendMessage(IntPtr hWnd, uint msg, IntPtr wParam, IntPtr lParam);
Meanwhile, it should be noted that this call lets the shield icon shows,
SendMessage(btn.Handle, BCM_SETSHIELD, 0, (IntPtr)1);
while this call hides the shield, as explained by Microsoft at https://msdn.microsoft.com/en-us/library/aa361904.aspx
SendMessage(btn.Handle, BCM_SETSHIELD, 0, (IntPtr)0);
0
Hello Lex,
Thank you for sharing this information with the community. I have also updated your Telerik points.
Regards,
Dess
Telerik
Thank you for sharing this information with the community. I have also updated your Telerik points.
Dess
Telerik
Do you want to have your say when we set our development plans?
Do you want to know when a feature you care about is added or when a bug fixed?
Explore the
Telerik Feedback Portal
and vote to affect the priority of the items
0
Here is yet another way to get the UAC icon and set it to any control you may need:
Regards,
Stefan
Telerik by Progress
System.Drawing.Icon myIcon =
new
System.Drawing.Icon(System.Drawing.SystemIcons.Shield, 16, 16);
radButton1.Image = myIcon.ToBitmap();
Regards,
Stefan
Telerik by Progress
Check out the Windows Forms project converter, which aids the conversion process from standard Windows Forms applications written in C# or VB to Telerik UI for WinForms.For more information check out this blog post and share your thoughts.