PDA

View Full Version : حرفه ای: اخطار ویندوز در کار با ریجستری!



AlgorithmX
سه شنبه 09 فروردین 1390, 23:23 عصر
سلام!

دوستان من برنامه ای دارم که باید چنتا اطلاعات رو در ریجستری ذخیره کنه اما در زمان اجرا به دستورات کار با ریجستری گیر میده!! (البته ویندوز 7 دارم و اخطارش هم مربوط به Action Center نیست که Y/N بپرسه. فکر کنم مشکل از سورس منه!!؟)

ابتدا کار اینو نوشتم که اجازه کار با ریجستری رو برام بگیره :

using Microsoft.Win32;


بعد برای کار با آدرسم در ریجستری یک متقیر registryKey تعریف کردم که در آدرس ( HKEY_LOCAL_MACHINE\SOFWARE\test ) کارکنه:

RegistryKey reg = Registry.LocalMachine.OpenSubKey(@"software\test", true);


در این آدرس string ی هست با نام name که با دستور زیر می خواهم برنامه ام مقدار داخل اونو برام داخا تکس باکس1 بریزه اما برنامه دقیقا به همین خط گیر میده!!
دستورم:

textbox1.Text = reg.GetValue("name").ToString();



چرا؟! (میشه راهنمایی کنید!)

mehranmsba
چهارشنبه 10 فروردین 1390, 00:43 صبح
1- رجیستری به حروف کوچک و بزرگ حساس هست .
2-خطا را بنویسید ببینیم چی می گه؟
3-UAC در بعضی برنامه ها سوالی نمی پرسه شما کلا غیر فعالش کن خودت رو راحت کن.

AlgorithmX
چهارشنبه 10 فروردین 1390, 01:02 صبح
1- رجیستری به حروف کوچک و بزرگ حساس هست .
2-خطا را بنویسید ببینیم چی می گه؟
3-UAC در بعضی برنامه ها سوالی نمی پرسه شما کلا غیر فعالش کن خودت رو راحت کن.

1. رعایت کردم.

2. درحالت دیباگ:68032


درحالت غیر دیباگ:68033


3. غیر فعاله.

IMANAZADI
چهارشنبه 10 فروردین 1390, 01:50 صبح
دوست عزیز امنیت ویندوز 7 اجازه نمیده
یا کاربر باید برنامه را RUN AS ADMINSTRATOR اجرا کنه تا برنامه ایراد نگیره یا User Account control را در پایین سطح خود قرار داد

mehranmsba
چهارشنبه 10 فروردین 1390, 02:18 صبح
شما ابتدا :

RegistryKey reg =new RegistryKey();

حالا

reg = Registry.LocalMachine.OpenSubKey(@"software\test", true);


موفق باشيد.

Directx
چهارشنبه 10 فروردین 1390, 02:26 صبح
دوست عزیز کلاس RegistryKey که constructor نداره که از کلمه new استفاده می کنید در ضمن چون این خطا در هنگامی که یه نمونه از کلاس جاری ساخته نشده ایجاد میشه و چون تابع OpenSubKey یه نمونه از RegistryKey رو به reg ادرس میده پس می شه نتیجه گرفت که نمونه ای از reg درست refrence نشده به regitrykey مورد نظر و می تونیم نتیجه بگیریم که ویندوز این امکانو به کاربر نداده البته این درحد یه حدسه و ممکنه اشکال از یه جای دیگه ی برنامه باشه تشکر

Felony
چهارشنبه 10 فروردین 1390, 06:15 صبح
در ویندوز ویستا و 7 برای نوشتن در Local Machine برنامه نیاز به دسترسی Admin داره ، برای نوشتن با هر دسترسی باید در Current User بنویسید .

AlgorithmX
چهارشنبه 10 فروردین 1390, 22:28 عصر
دوست عزیز امنیت ویندوز 7 اجازه نمیده
یا کاربر باید برنامه را RUN AS ADMINSTRATOR اجرا کنه تا برنامه ایراد نگیره یا User Account control را در پایین سطح خود قرار داد

بازهم همون طوریه!

AlgorithmX
چهارشنبه 10 فروردین 1390, 22:36 عصر
شما ابتدا :

RegistryKey reg =new RegistryKey();

حالا

reg = Registry.LocalMachine.OpenSubKey(@"software\test", true);


موفق باشيد.


استاد زیر همون خطی که اضافه کردید خط قرمز میکشه! (و متغیری با این نام در پژه ام هم ندارم!)
68079

AlgorithmX
چهارشنبه 10 فروردین 1390, 22:39 عصر
دوست عزیز کلاس RegistryKey که constructor نداره که از کلمه new استفاده می کنید در ضمن چون این خطا در هنگامی که یه نمونه از کلاس جاری ساخته نشده ایجاد میشه و چون تابع OpenSubKey یه نمونه از RegistryKey رو به reg ادرس میده پس می شه نتیجه گرفت که نمونه ای از reg درست refrence نشده به regitrykey مورد نظر و می تونیم نتیجه بگیریم که ویندوز این امکانو به کاربر نداده البته این درحد یه حدسه و ممکنه اشکال از یه جای دیگه ی برنامه باشه تشکر

میشه با مثال توضیح بدین! (چی بنویسم؟!)

AlgorithmX
چهارشنبه 10 فروردین 1390, 22:47 عصر
در ویندوز ویستا و 7 برای نوشتن در Local Machine برنامه نیاز به دسترسی Admin داره ، برای نوشتن با هر دسترسی باید در Current User بنویسید .

یعنی به نظر شما سورس دیگه هیچ مشکلی نداره ( ! )


ببینید دوستان ساده بگم ( وقت همه رو هم گرفتم ببخشید!) من یک برنامه می خواهم که در آدرس "HKEY_LOCAL_MACHINE\SOFWARE\test" یک string با نام name هست که اطلاعات توش رو برام بخونه ، حالا از هر روشی خودتون استفاده می کنید یک مثال برای من هم بزنید ممنون میشم!:لبخند:

navidkhalilian
پنج شنبه 11 فروردین 1390, 01:52 صبح
سلام دوست من امتحان کن امید وارم مشکلت حل بشه.
using Microsoft.Win32;
string regPath = @"Software\test";
RegistryKey regKey = Registry.LocalMachine.CreateSubKey(regPath);
string regEntry;
regEntry = (string)regKey.GetValue("SkipOwnProc");
MessageBox.Show(regEntry);
موفق باشید

mehranmsba
پنج شنبه 11 فروردین 1390, 16:04 عصر
بابت پستی که ساختار اشتباه داشت عذر می خواهم(خیلی زیاد) تو رخت خواب بودم ساعت 3 بود خودم امتحانش نکردم.

اگر شما می خواهید فقط بخوانید چرا خاصیت نوشتن را True می کنید؟

شاید برای همین ویندوز به شما اجازه نمی ده. من مشابه برنامه شما را بدون مشکل اجرا کردم:

public string InstalledPath()
{

RegistryKey langAddr;
string temp = null;
try
{
langAddr = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\test");
temp = langAddr.GetValue("name").ToString();

return temp;
}
catch(Exception E)
{
MessageBox.Show(E.ToString());
return string.Empty;

}

}



شما خوب نام ها و رشته هات رو بررسی کن ، اگر دسترسی به رایانه دیگر دارید اونجا هم امتحان بکنید . در هر صورت من مشکلی در کد های شما ندارم.

اگر بازهم مشکلی بود شما Permission کلیدی که در رجیستری ساختید رو بررسی کنید، این طوری:
http://msba2.persiangig.com/image/ssssssssss.png

همچنین شما می توانید نرم افزاری پرمیژن ها رو بررسی کنید:
(آیا این کلید محافظت امنیتی می شود؟)

langAddr.GetAccessControl().AreAccessRulesProtecte d


در هر صورت شما یا اجازه ندارید یا آدرستان اشتباه است.(این ها exception های اصلی رجیستری است)

بابت آن پست دوباره متاسفم.

موفق باشید.

AlgorithmX
پنج شنبه 11 فروردین 1390, 19:58 عصر
سلام دوست من امتحان کن امید وارم مشکلت حل بشه.
using Microsoft.Win32;
string regPath = @"Software\test";
RegistryKey regKey = Registry.LocalMachine.CreateSubKey(regPath);
string regEntry;
regEntry = (string)regKey.GetValue("SkipOwnProc");
MessageBox.Show(regEntry);
موفق باشید

ازت ممنوتم ولی میشه بگی کار این برانه چیه؟؟
چون در حالت ادمین هم پیام خالی میده!!
کلیدی با نام SkipOwnProc ساختم در آدرسم ولی هیچی نشون نداد
!!!...!! :ناراحت:ببخشیدها:ناراحت: !!...!!!

AlgorithmX
پنج شنبه 11 فروردین 1390, 20:35 عصر
سلام دوستان!
آقا من شرمنده ام ولی ببینید من این کارها رو انجام دادم ولی به نتیجه نرسیدم! (چرا؟)
1. UAC آزاده
2. در آدرس HKEY_LOCAL_MACHINE\SOFWARE\test" یک string با نام name هست که اطلاعاتی هم توش هست
3. توی برنامه ام نوشتم :
using Microsoft.Win32;


private void button1_Click(object sender, EventArgs e)
{
RegistryKey langAddr;
string temp = null;
langAddr = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\test");
temp = langAddr.GetValue("name").ToString();
textBox1.Text = temp;
}


4. برنامه ام در زمان اجرا به خط زیر گیر میده:
temp = langAddr.GetValue("name").ToString();

5. وقتی فایل exe رو هم ادمین اجرا میکنم پیغام خطا و کانتنیو میده.

ببخشید مشکل ما شر شدها !!

mehranmsba
جمعه 12 فروردین 1390, 02:15 صبح
دوست عزیز من رفتم کلید test رو پاک کردم ببینم چه اروری می دیده همون error شماست. شما ببین رشته درون کلیدت پیدا میشه؟این طوری:

foreach (string str in langAddr.GetValueNames())
MessageBox.Show(str);

اگر نام رشته شما را داد که شما از آن نام استفاده کن
اگر نداد بدانبد که پیدا نمی کنه و این یک مشکل عجیب هست .(من دیگه نمی دونم.)
اگر هم ارور داد بدونید که کلیدتان را پیدا نمی کنه و معلوم هست که آن کلید یا گم شده یا نامش اشتباه است یا وجود ندارد.

موفق باشید.

navidkhalilian
جمعه 12 فروردین 1390, 03:28 صبح
دوست عزیز من کدی که برات نوشتم را روی ویندوز vista و xp و seven امتحان کردم مشکلی نداشت.شما با یوزر administrator وارد بشید و امتحان کنید.اگر نشد متن خطا رو بنویسید.

AlgorithmX
شنبه 13 فروردین 1390, 11:56 صبح
دوست عزیز من کدی که برات نوشتم را روی ویندوز vista و xp و seven امتحان کردم مشکلی نداشت.شما با یوزر administrator وارد بشید و امتحان کنید.اگر نشد متن خطا رو بنویسید.

دوست گلم من سورس شما اینطوری نوشتم:
private void button1_Click(object sender, EventArgs e)
{
string regPath = @"Software\test";
RegistryKey regKey = Registry.LocalMachine.CreateSubKey(regPath);
string regEntry;
regEntry = (string)regKey.GetValue("name");
MessageBox.Show(regEntry);
}

پروژه رو Build کردم و در آدرس Bin پروژه رو ادمین اجرا کردم. برنامه که اخطاری نمی ده هیچ ، کلا مسیج باکس خالی هم تحویل میده. ببین:
68172


آخه چه مشکلش هست؟؟

navidkhalilian
یک شنبه 14 فروردین 1390, 23:29 عصر
دوست عزیز این کدی که برات نوشتم را روی یه سیستم دیگه امتحان کن اگر جواب گرفتی سیستمت مشکل داره یبار ویندوز عوض کن.موفق باشی

AlgorithmX
دوشنبه 15 فروردین 1390, 20:47 عصر
دوست عزیز این کدی که برات نوشتم را روی یه سیستم دیگه امتحان کن اگر جواب گرفتی سیستمت مشکل داره یبار ویندوز عوض کن.موفق باشی


ممکنه مشکل از ویندوز من Windows 7 SP1 x64 باشه (اما بعید میدونم!!:متفکر:)


تورو خدا کسی ایده دیگه ای نداره!!:ناراحت:

AlgorithmX
دوشنبه 15 فروردین 1390, 20:51 عصر
تورو خدا کسی ایده دیگه ای نداره!!:ناراحت:

خدا یا من یک برنامه ام در گیر این کاره!!!

کسی سورسی نداره که برنامه رو در حالت ادمین به صورت خودکار اجرا کنه؟؟؟
یا کدی که نوع اجرای برنامه رو (ادمین یا معمولی) به ما خبر بده؟؟

navidkhalilian
چهارشنبه 17 فروردین 1390, 00:05 صبح
دوست عزیز این مشکل فقط از طرف شماست پس مطمئن باش اشکال از طرف خودته.بهت پیشنهاد می کنم یبار روی Win xp 32 bit امتحان کن.حتما جواب میگیری.

AlgorithmX
جمعه 19 فروردین 1390, 19:30 عصر
از همه ممنونم که راهنماییم کردین !
من میرم روی سیستم دیگه چکش می کنم.


حالا یک سوال دیگه دارم (کمی بی ربطه اما ...)



کسی سورسی نداره که برنامه رو در حالت ادمین به صورت خودکار اجرا کنه؟؟؟
یا کدی که نوع اجرای برنامه رو (ادمین یا معمولی) به ما خبر بده؟؟

navidkhalilian
جمعه 19 فروردین 1390, 19:37 عصر
از همه ممنونم که راهنماییم کردین !
من میرم روی سیستم دیگه چکش می کنم.


حالا یک سوال دیگه دارم (کمی بی ربطه اما ...)


سلام دوست عزیز شما یک پروژه جدید باز کن و این دستورات رو داخلش بزار و کاربر باید برای اجرای برنامه روی این برنامه کلیک کنه تا برنامه اصلی شما در حالت administrator باز بشه.البته کاربر از این ماجرا خبر دار نیست(یجورایی این برنامه مثل یک shortcut برنامه شما رو اجرا می کنه)


try
{
path = path_to_your_exefile;

ProcessStartInfo myProcess = new ProcessStartInfo(path);
myProcess.Domain = domain;
myProcess.UserName = username;
myProcess.Password = password;
myProcess.UseShellExecute = false;

Process.Start(myProcess);
}
catch (Exception myException)
{
// error handling
}
موفق باشید

navidkhalilian
جمعه 19 فروردین 1390, 19:47 عصر
اگه کارت حل نشد از این استفاده کن

using System;
using System.Security.Principal;

class WindowsIdentityMembers
{
[STAThread]
static void Main(string[] args)
{
// Retrieve the Windows account token for the current user.
IntPtr logonToken = LogonUser();

// Constructor implementations.
IntPtrConstructor(logonToken);
IntPtrStringConstructor(logonToken);
IntPtrStringTypeConstructor(logonToken);
IntPrtStringTypeBoolConstructor(logonToken);

// Property implementations.
UseProperties(logonToken);

// Method implementations.
GetAnonymousUser();
ImpersonateIdentity(logonToken);

Console.WriteLine("This sample completed successfully; " +
"press Enter to exit.");
Console.ReadLine();
}

// Create a WindowsIdentity object for the user represented by the
// specified Windows account token.
private static void IntPtrConstructor(IntPtr logonToken)
{
// Construct a WindowsIdentity object using the input account token.
WindowsIdentity windowsIdentity = new WindowsIdentity(logonToken);

Console.WriteLine("Created a Windows identity object named " +
windowsIdentity.Name + ".");
}


// Create a WindowsIdentity object for the user represented by the
// specified account token and authentication type.
private static void IntPtrStringConstructor(IntPtr logonToken)
{
// Construct a WindowsIdentity object using the input account token
// and the specified authentication type.
string authenticationType = "WindowsAuthentication";
WindowsIdentity windowsIdentity =
new WindowsIdentity(logonToken, authenticationType);

Console.WriteLine("Created a Windows identity object named " +
windowsIdentity.Name + ".");
}

// Create a WindowsIdentity object for the user represented by the
// specified account token, authentication type, and Windows account
// type.
private static void IntPtrStringTypeConstructor(IntPtr logonToken)
{
// Construct a WindowsIdentity object using the input account token,
// and the specified authentication type, and Windows account type.
string authenticationType = "WindowsAuthentication";
WindowsAccountType guestAccount = WindowsAccountType.Guest;
WindowsIdentity windowsIdentity =
new WindowsIdentity(logonToken, authenticationType, guestAccount);

Console.WriteLine("Created a Windows identity object named " +
windowsIdentity.Name + ".");
}

// Create a WindowsIdentity object for the user represented by the
// specified account token, authentication type, Windows account type, and
// Boolean authentication flag.
private static void IntPrtStringTypeBoolConstructor(IntPtr logonToken)
{
// Construct a WindowsIdentity object using the input account token,
// and the specified authentication type, Windows account type, and
// authentication flag.
string authenticationType = "WindowsAuthentication";
WindowsAccountType guestAccount = WindowsAccountType.Guest;
bool isAuthenticated = true;
WindowsIdentity windowsIdentity = new WindowsIdentity(
logonToken, authenticationType, guestAccount, isAuthenticated);

Console.WriteLine("Created a Windows identity object named " +
windowsIdentity.Name + ".");
}
// Access the properties of a WindowsIdentity object.
private static void UseProperties(IntPtr logonToken)
{
WindowsIdentity windowsIdentity = new WindowsIdentity(logonToken);
string propertyDescription = "The Windows identity named ";

// Retrieve the Windows logon name from the Windows identity object.
propertyDescription += windowsIdentity.Name;

// Verify that the user account is not considered to be an Anonymous
// account by the system.
if (!windowsIdentity.IsAnonymous)
{
propertyDescription += " is not an Anonymous account";
}

// Verify that the user account has been authenticated by Windows.
if (windowsIdentity.IsAuthenticated)
{
propertyDescription += ", is authenticated";
}

// Verify that the user account is considered to be a System account
// by the system.
if (windowsIdentity.IsSystem)
{
propertyDescription += ", is a System account";
}
// Verify that the user account is considered to be a Guest account
// by the system.
if (windowsIdentity.IsGuest)
{
propertyDescription += ", is a Guest account";
}

// Retrieve the authentication type for the
String authenticationType = windowsIdentity.AuthenticationType;

// Append the authenication type to the output message.
if (authenticationType != null)
{
propertyDescription += (" and uses " + authenticationType);
propertyDescription += (" authentication type.");
}

Console.WriteLine(propertyDescription);

// Display the SID for the owner.
Console.Write("The SID for the owner is : ");
SecurityIdentifier si = windowsIdentity.Owner;
Console.WriteLine(si.ToString());
// Display the SIDs for the groups the current user belongs to.
Console.WriteLine("Display the SIDs for the groups the current user belongs to.");
IdentityReferenceCollection irc = windowsIdentity.Groups;
foreach (IdentityReference ir in irc)
Console.WriteLine(ir.Value);
TokenImpersonationLevel token = windowsIdentity.ImpersonationLevel;
Console.WriteLine("The impersonation level for the current user is : " + token.ToString());
}

// Retrieve the account token from the current WindowsIdentity object
// instead of calling the unmanaged LogonUser method in the advapi32.dll.
private static IntPtr LogonUser()
{
IntPtr accountToken = WindowsIdentity.GetCurrent().Token;
Console.WriteLine( "Token number is: " + accountToken.ToString());

return accountToken;
}

// Get the WindowsIdentity object for an Anonymous user.
private static void GetAnonymousUser()
{
// Retrieve a WindowsIdentity object that represents an anonymous
// Windows user.
WindowsIdentity windowsIdentity = WindowsIdentity.GetAnonymous();
}

// Impersonate a Windows identity.
private static void ImpersonateIdentity(IntPtr logonToken)
{
// Retrieve the Windows identity using the specified token.
WindowsIdentity windowsIdentity = new WindowsIdentity(logonToken);

// Create a WindowsImpersonationContext object by impersonating the
// Windows identity.
WindowsImpersonationContext impersonationContext =
windowsIdentity.Impersonate();

Console.WriteLine("Name of the identity after impersonation: "
+ WindowsIdentity.GetCurrent().Name + ".");
Console.WriteLine(windowsIdentity.ImpersonationLev el);
// Stop impersonating the user.
impersonationContext.Undo();

// Check the identity name.
Console.Write("Name of the identity after performing an Undo on the");
Console.WriteLine(" impersonation: " +
WindowsIdentity.GetCurrent().Name);
}
}

AlgorithmX
جمعه 19 فروردین 1390, 21:49 عصر
دوست عزیز میشه بگی از کد دوم چطوری استفاده کنم؟ (یکم بیشتر درموردش توضیح بدید!)

navidkhalilian
جمعه 19 فروردین 1390, 22:08 عصر
دوست عزیز دستورات داخل اولین تابع(Main) روش استفاده هست.
موفق باشید

AlgorithmX
شنبه 20 فروردین 1390, 15:58 عصر
کپی کردم.
اما تا اونجایی که می دونم اگر برنامه ای خودشو admin اجرا کنه Y/N پرسیده میشه! (درسته؟) اما بعد اجرا اتفاقی پیش نمی آید...!

navidkhalilian
شنبه 20 فروردین 1390, 23:30 عصر
کپی کردم.
اما تا اونجایی که می دونم اگر برنامه ای خودشو admin اجرا کنه Y/N پرسیده میشه! (درسته؟) اما بعد اجرا اتفاقی پیش نمی آید...!

میتونی برنامه رو طوری تنظیم کنی که یا خودش روی Yes کلیک کنه یا اینکه تا کاربر بر روی yes کلیک نکرده برنامه به مرحله بعد نره.یا اینکه از کدی استفاده کنی که ازت سوال نپرسه.اگر بتونم کدش رو واست می نویسم.

hossin.esm
یک شنبه 21 فروردین 1390, 08:04 صبح
یک روش برای اجرا برنامه با admin االبته با کد
کار تابع IsRunAsAdmin() چک کردن اجرای برنامه با admin هست


using System;
using System.Linq;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows.Forms;
using System.Security.Principal;

namespace run_admin
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(fals e);

if (!IsRunAsAdmin())
{

ProcessStartInfo proc = new ProcessStartInfo();
proc.UseShellExecute = true;
proc.WorkingDirectory = Environment.CurrentDirectory;
proc.FileName = Application.ExecutablePath;
proc.Verb = "runas";

try
{
Process.Start(proc);
return;

}
catch
{
return;
}
Application.Exit();

}
Application.Run(new Form1());
}
static bool IsRunAsAdmin()
{
WindowsIdentity id = WindowsIdentity.GetCurrent();
WindowsPrincipal principal = new WindowsPrincipal(id);
return principal.IsInRole(WindowsBuiltInRole.Administrato r);
}
}
}

AlgorithmX
یک شنبه 21 فروردین 1390, 14:27 عصر
همتونو دوست دارم! وممنون!

میدونید که اگر سیستم شرکت تولید کننده محصول رو بدونه پیغام به نحو دیگری ظاهر میشود. اما اگر نه به صورن زرد رنگ ، ناشناس بودن برنامه را اعلان می کند..
حالا چه کار کنیم که برنامه ما توسط ویندوز شناسایی بشه؟؟

نام انتشار دهنده برنامه هم اگر شرکتش آشنا تعریف کنیم اما باز هم ناشناس توسط ویندوز تلغی می شه!!

navidkhalilian
یک شنبه 21 فروردین 1390, 23:45 عصر
منظورتو هم فهمیدم هم نفهمیدم.یخورده واضح تر بگو.

AlgorithmX
دوشنبه 22 فروردین 1390, 01:17 صبح
منظورتو هم فهمیدم هم نفهمیدم.یخورده واضح تر بگو.

عزیزم ببین وقتی می خواهم برنامه ای از شرکت مایکروسافت نصب کنی UAC (همون Y/N) به شما پیغامی مبنی بر این که این برنامه محصولی از مایکروسافت است ونشان دهنده اینه که برنامه منتشر شده از یک شرکت معتبر و قابل شناسایی برای ویندوز است را صادر می کند. حالا ویندوز مگه از روی شرکت منتشر کننده برنامه رو شماسایی نمی کنه! پس چرا وقتی کمپانی برنامه رو مایکروسافت می زاریم ویندوز نام شرکت رو نا معلوم اعلان می کنه؟!

navidkhalilian
دوشنبه 22 فروردین 1390, 02:01 صبح
دوست عزیز دلیلش رو نمیدونم اما فقط میدونم نام کمپانی حالت نمایشی داره مثل خصوصیت Text یک button شاید مورد دیگه ای رو بررسی میکنه.اگر چیزی پیدا کردم بهت میگم.