برگزیده های پرشین تولز

خطايي که نبايد مشاهده شود .

hamid1345

کاربر تازه وارد
تاریخ عضویت
14 ژانویه 2004
نوشته‌ها
121
لایک‌ها
0
من يک برنامه دارم که Setup آنرا با Wise Installer ساخته‌ام . حال چون چند فايل DLL را جايگزين مي‌کنم ويندوز اين پيام را مي‌دهد.البته اگر کاربر به آن توجه نکند چيزي نمي‌شود . چکار کنم که ويندوز اين پيام را ندهد يا کاربر آنرا قبل از Restart نبيند؟

error.JPG
 

karagah

کاربر تازه وارد
تاریخ عضویت
22 می 2004
نوشته‌ها
63
لایک‌ها
0
دوست عزیز
تنها راه براي خلاص شدن از شر اين پیغام ،غیر فعال کردن Windows File Protection هست که این کار باعث آسیب پذیری و ناپایداری سیستم میشه . برای اینکار باید sfc.dll رو دستکاری کنید و بعد هم رجیستری رو دستکاری کنید.
شما این برنامه رو برای چه ویندوزی نوشتید؟ فکر نمی کنم در Windows XP احتیاجی به تغییر فایل kbdfa.dll داشته باشید!
اگه می خواهید برنامه روی ویندوز های مختلف نصب بشه باید کاری کنید که برنامه ورژن ویندوز رو تشخیص بده و فقط روی ویندوز های قبل از 2000 این فایل رو نصب کنه.
 

hamid1345

کاربر تازه وارد
تاریخ عضویت
14 ژانویه 2004
نوشته‌ها
121
لایک‌ها
0
kbdfa.dll به دلايل متعدد بايد براي فارسي نويسي در ويندوز XP و 2000 عوض بشود .البته به صورت دستي آنرا در safe Mode عوض مي‌کنند .حالا من آنرا توانسته‌ام عوض کنم بدون آنکه کاربر لازم باشد کار خاصي انجام دهد. منتها براي تکميلي کار مي‌خواهم اين پيغام خطا که تنها يکبار قبل از Restart نشان داده مي‌شود ، نشان داده نشود .

نه مي‌خواهم وينوز مقصد را خراب کنم و نه قصد سويي دارم .فقط همين ! :blush:
 

karagah

کاربر تازه وارد
تاریخ عضویت
22 می 2004
نوشته‌ها
63
لایک‌ها
0
من یه راه ساده برای بستن فوری این پنجره پیدا کردم.امیدوارم که مشکلتون رو حل کنه.

برای اینکار باید از API ها کمک بگیرید ، معرفی API:
کد:
Private Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

روش کار برنامه:
1- handel پنجره رو به به کمک تابع FindWindow بدست میاریم.
2- یک پیغام close به پنجرو می فرستیم.
حالا یک پنجره دیگه باز میشه که نمیشه close اش کرد و باید دکمه yes انتخاب بشه .
3-handle پنجره جدید رو بدست میاریم و با sendkeys کلیدهای alt+y رو براش میفرستیم.
کد:
Private Sub KillWFPmessage()
    'Coded by: Karagah (pt_karagah at yahoo dot com)
    'You may use this code in your projects freely
    'as long as this notice remains intact.
   
    Const WM_CLOSE = &H10
    Dim handle1 As Long
    Dim handle2 As Long
    handle1 = 0
    handle2 = 0
    
    Do While handle1 = 0
        handle1 = FindWindow(vbNullString, "Windows File Protection")
    Loop
    Call SendMessage(handle1, WM_CLOSE, 0, 0)
    
    DoEvents
    
    handle2 = handle1
    Do While handle2 = handle1
        handle2 = FindWindow(vbNullString, "Windows File Protection")
    Loop
    Call SetForegroundWindow(handle2)
    SendKeys "%Y"

End Sub
 

hamid1345

کاربر تازه وارد
تاریخ عضویت
14 ژانویه 2004
نوشته‌ها
121
لایک‌ها
0
خوبه ؟ معلومه برنامه‌نويس واردي هستي .

اما من فکر مي‌کنم خود Wise Installer راهي دارد که اين پنجره را ببندد . چون از طريق آن setup درست کرده‌ام ، بي‌سليقگي است که اگر خودش راهي داشته باشد به برنامه‌نويسي روي بياورم . نه ؟ :cool:
 

karagah

کاربر تازه وارد
تاریخ عضویت
22 می 2004
نوشته‌ها
63
لایک‌ها
0
فكر نمي كنم wise installer بتونه این کارو انجام بده. چون تغییر فایل های حساس سیستم عامل فقط موقع نصب Hotfix ها و service pack ها و یا upgrade ویندوز مجازه.
 
بالا