# Notification.
Notification

Author Topic: เอา "Format..." ออกจาก Context Menu ของ Windows 7 ซึ่งทำจาก Registry ไม่ได้  (Read 5685 times)

0 Members and 1 Guest are viewing this topic.

Offline ans58670

  • Webmaster
  • *****
  • Posts: 2040
    • View Profile
แรกเริ่มจริงๆได้ตอบปัญหานี้เอาไว้ใน MSDN แต่พบว่าเจ้าของหัวข้อต้องการทราบวิธีจากการใช้ Registry ซึ่งจะทำตามที่เขาต้องการไม่ได้ก็เลยลบทิ้งไปจาก MSDN จากนั้นก็ไปเจออีกหลายๆหัวข้อที่ถามเรื่องนี้จาก Web หนึ่ง ตอนแรกก็เฉยๆ แต่ดูแล้วว่าทุกคนน่าจะ "โตจนหมาเลียตูดไม่ถึง" กันหมดแล้ว น่าจะสามารถรับผิดชอบและนำไปพัฒนากันต่อได้ ก็เลยตอบเขาไป และได้เรียบเรียงใหม่เอามาใส่ไว้ที่นี่ด้วยเพื่อให้คนอื่นๆได้ศึกษาและพัฒนาต่อไป เพราะวิธีแก้ Context Menu ที่เป็น Core ของ Windows นี้ ยังไม่มี Software ใดแก้ได้ ต้องทำแบบ Manual เท่านั้น (ถ้าอ่านจนจบและเข้าใจความหมายของคำว่า Software แล้วจะเข้าใจว่าทำไมถึงไม่ใช้คำว่า Program)

เริ่มต้นด้วยการเอารูปความแตกต่างของ Context Menu ทั้งแบบที่ มี "Format..." และ ไม่มี "Format..." ที่ทำให้ดูใน Windows Developer Preview มาให้ดูก่อน

(แบบที่ มี "Format...")


(แบบที่ ไม่มี "Format...")


ให้ลองสังเกตุดูใน Context Menu ที่ส่วนบนๆ กับ Context Menu ที่ส่วนล่างๆ มันมีที่มาที่ไปต่างกัน

Context Menu ในส่วนบน จะอยู่ใน Registry และมีบางรายการที่เกิดจากการติดตั้งโปรแกรมเพิ่มเติม ซึ่งส่วนใหญ่จะเพิ่มเข้าไปใน Registry จึงได้อยู่ใน Context Menu ส่วนบนนี้ เช่น Avast และ Unlocker ที่นำมาแสดง ซึ่งวิธีการแก้ไขก็สามารถหาดูได้จาก Google ซึ่งมีอยู่อย่างมากมาย จึงจะไม่กล่าวถึง (แต่วิธีที่เราจะทำนี้ ไม่มีใน Google แน่นอน)

Context Menu ในส่วนล่าง จะไม่อยู่ใน Registry หากแต่คนส่วนมากเข้าใจผิด คิดว่าหาได้ใน Registry จนบางครั้งนึกว่ามันใช้ {GUID} ที่เป็น Hex Code แทนค่าของชื่อใน Registry ซึ่งเป็นความเข้าใจที่ไม่ถูกต้อง หากต้องการรู้ว่า {GUID} เหล่านั้นแทนค่าของอะไร ให้ใช้ "Find" ใน Regedit หรืออาจใช้โปรแกรมฟรีชื่อ ShellExView ของ Nirsoft เปิดดูก็ได้

การแสดงค่าใน Context Menu ส่วนล่างนี้จะเกิดจากการเรียกใช้ file โดยการให้ Integrate เข้าไปกับ file ที่เรียกใช้ ซึ่งจะปรากฏขึ้นได้ในแต่ละครั้งที่มีการเรียกใช้เป็นคราวๆไป จึงมิได้ไปปรากฏอยู่ใน Registry ดังที่หลายคนเข้าใจ

ในกรณีที่ต้องการจะแก้ไขนี้ คงต้องดูว่า Windows 7 ใช้ File อะไรอยู่ในการเปิดหน้า "Computer" เพื่อที่จะต่อไปยังการเปิด Context Menu ซึ่งเมื่อดูใน Task Manager แล้วก็จะพบว่า file ที่ใช้นี้ก็คือ "Explorer.exe" เจ้าหากินประจำของ Windows

เมื่อทราบว่าเป็น Explorer.exe แล้ว ก็ลองสำรวจตัวมันดู จะพบว่าตัวมันเองนั้นไม่มี Context Menu ในตัว นั่นจึงแสดงว่า มันจะต้องเรียกไฟล์อื่นมา Integrate เอา Context Menu มาใช้ ซึ่งการดึงมาใช้แบบนี้จะต้องดึงมาจาก File ที่ไม่สามารถ Run ได้ด้วยตัวของมันเอง แต่ต้องให้ File อื่นเรียกมันมาใช้ อันเป็นเหตุให้ svchost.exe ต้องทำงานอีกแล้ว เพราะนั่นหมายถึงการเรียก Dynamic-Link Librery หรือ dll มาใช้

แล้วมันเอาตัวไหนมาใช้เล่า? บอกให้เลยโดยไม่ต้องไปเปิด Task Manager หาดูจาก Service ให้เสียเวลา มันก็ใช้ของหากินประจำที่ชื่อ "Shell32.dll" นั่นปะไร

ลองค้นๆหาๆดูใน Google ก็จะพบแต่วิธีลบ "Format Dialog" ใน Windows XP (อ่านไปจนจบแล้วเดี๋ยวก็จะประยุกต์เองได้ว่าจะลบ Dialog ได้อย่างไร?) โดยที่ยังทิ้ง "Format..." เอาไว้ หากแต่เมื่อกด "Format..." จาก Context Menu แล้วจะไม่มีอะไรเกิดขึ้น ซึ่งก็ไม่ตรงกับความต้องการของเรา

อยากให้ลองใช้ ResHacker เปิดดู Shell32.dll ใน Windows 7 แล้วจะพบว่าโครงสร้างภายในไม่เหมือนกับ Shell32.dll ของ Windows XP โดยใน Windows 7 จะมีน้อยกว่าใน Windows XP

สิ่งที่เราต้องการแก้ใน Windows 7 ก็คือ Context Menu ซึ่งหากเราเฉลียวใจสักนิดแล้วเปิดดูใน Shell32.dll ของ Windows XP ก็จะทราบได้เลยว่ามันจะต้องอยู่ใน Resource Type ที่เป็น MENU (แหม...ก็ชื่อมันบอกเสียขนาดนั้น ซึ่งถ้าเป็น Windows XP ก็แก้ใน Shell32.dll นี้ได้เลย)

แต่ใน Windows 7 นั้น จากความต้องการของ User อย่างเราๆทำให้ Microsoft ต้องแยก File หลายๆไฟล์ให้แสดงออกมาได้หลายๆภาษาจะได้หาเงินได้กว้างขึ้นและลดขนาดโดยรวมลง โดย File ที่ดึงบางส่วนของ File ดั้งเดิมที่แยกภาษาออกมานี้ เขาเรียกว่า Multilingual User Interface หรือตัวย่อคือ MUI ซึ่งนี่เป็นเหตุให้ใน Shell32.dll ของ Windows 7 ไม่มี Resource Type ที่เป็น MENU เพราะ "Menu" ก็ต้องแสดงออกมาเป็น "ภาษา" ซึ่งตามหลักการของ Windows รุ่นใหม่ๆนั้น เขาจึงต้องแยกมันออกมา โดยใช้ชื่อว่า "Shell32.dll.mui" หรือเรียกได้ว่าเป็น File ภาษาของ Shell32.dll

ในเมื่อเขาแยกเอาส่วนที่ต้องแสดงเกี่ยวกับภาษาในแต่ละ dll ออกมา แล้วเขาเอามันไปเก็บไว้ที่ไหน? เขาก็เอามันไปเก็บเอาไว้ใน Folder ตามชื่อภาษานั้นๆ เช่น หากมีภาษาไทย เขาก็แยกเอาเฉพาะส่วนแสดงภาษานี้ไปเก็บไว้ใน "th-TH" ซึ่งจากการติดตั้ง Windows 7 โดยทั่วไป เขาติดตั้งเป็นภาษาอะไรเล่า? ก็คือติดตั้งเป็น ภาษาอังกฤษแบบอเมริกัน ดังนั้นเขาก็เก็บส่วนแสดงภาษาเอาไว้ใน "en-US" หรือ Path เต็มๆของมันก็คือ...
    \\Windows\System32\en-US\

เรารู้ที่อยู่ของ MUI แล้วก็ลองเข้าไปเปิดดูก็จะเจอ Shell32.dll.mui อยู่ในนี้...เรา copy เอามันออกมาเสีย เพราะมันกำลังทำงานอยู่ แก้ไขขณะมันทำงานไม่ได้ จึงต้อง Copy ออกมาแก้ไขให้เสร็จ แล้วค่อยยัดกลับไปที่เดิม

เมื่อเราเปิด Shell32.dll.mui ที่ Resource Type เป็น MENU ก็จะพบ Resource Name มากมาย ทีนี้แหละที่เราต้องมาหากันว่ามันอยู่ที่ไหน? หากจะหักด้ามพร้าด้วยเข่า...ก็ไล่หามันทีละตัวก็เสียเหลี่ยมลูกกำนันหมด ดังนั้น เรามาดูเทคนิคที่ถูกลืมไปแล้วของคนรุ่นก่อนๆว่าจะหาเจอง่ายๆได้อย่างไรกันดีกว่า

พวกวัยรุ่นตอนปลายเหมือนอย่างข้าพเจ้านี้ เคยใช้ Computer กันในแบบที่ไม่มี Mouse ใช้กันแต่ Keyboard จึงเป็นเหตุให้ต้องรู้ Key ลัดต่างๆพอสมควร ดังนั้น เราจะต้องเอาประโยชน์ของการใช้ Key ลัดพวกนี้มาใช้ในการหาของที่ต้องการใน Shell32.dll.mui

เรามาดูกันซิว่าอะไรคือ Key ลัดโดยปกติโดยไม่ต้องใช้ Mouse Click ของ "Format..." ใน Context Menu?

เริ่มด้วยการเปิด "Computer" ใน Windows 7 ที่จะนำท่านไปสู่หน้าจอที่เป็น Drive ต่างๆ จากนั้นเลือก Drive มั่วๆมาสัก Drive หนึ่งโดย Click Mouse ที่ Drive นั้น 1 ครั้งเพื่อให้ Drive นั้น "Active"

ต่อไปไม่ต้องแตะ Mouse แล้ว ให้ใช้แต่ Keyboard ล้วนๆ ให้กดปุ่ม <Alt> (เป็นสินค้าดั้งเดิม แปลว่าให้ไปที่ Menu Bar) แล้วตามด้วยปุ่ม <F> (ก็แปลว่าให้เลือก "File") หรือไม่เช่นนั้นก็ให้กดปุ่มทางขวามือที่เป็นรูป Menu และมี Pointer ชี้อยู่ ซึ่งอยู่ตรงกลางระหว่างปุ่ม <Windows Logo> กับปุ่ม <Ctrl> นี่แหละพี่น้อง คือปุ่ม "Context Menu"

ผลลัพท์ที่ได้คือจะมี Menu ปรากฏขึ้น ลองมองหาคำที่เราต้องการคือ "Format..." จะพบว่ามันเขียนว่า "Format..." ซึ่งมีขีดเส้นใต้ที่ตัวอักษร a ซึ่งเท่านี้แหละที่เราต้องการทราบเพื่อใช้ในการหาจากใน Resource Type : MENU

การจะให้แสดงข้อความออกมาเช่นนี้ได้ นั่นแปลว่าในตัวข้อความจริงที่ใช้เขียนโปรแกรม จะต้องใส่เครื่องหมาย "&" ไว้ข้างหน้าตัวอักษรที่ขีดเส้นใต้ ดังนั้นจึงแปลว่า ข้อความที่เราจะต้องมองหาจริงๆนั้นเขียนว่า
    Form&at...

ให้เปิด Shell32.dll.mui โดยใช้ ResHacker แล้วกด <Ctrl> + <F> จะได้หน้าจอ "Find" จากนั้นเราก็พิมพ์ข้อความตามที่เราต้องการหาใส่ลงไป แล้วกด <Enter>

เปรี้ยงเดียวปะ...เท่านี้ท่านก็เจอแล้วว่ามันอยู่ที่ไหน...ลองดูเอาเองถึงผลจาก "Find" ใน ResHacker ซึ่งจะได้ดังภาพ


ให้เลือกทั้งแถว (Line 6) ดังแถบสีดำในภาพ แล้ว Delete ทิ้ง


จะออกมาดังรูป ให้กดปุ่ม <Compile Script> ที่เราได้แก้ไข


เมื่อกดไปแล้ว ปุ่ม <Compile Script> จะกลายเป็นสีเทา จากนั้นก็กด <Ctrl> + <S> เพื่อ Save File


จากนั้นเราต้อง Reboot เครื่องเข้า MiniXP หรือ Win7PE แล้วก็แทนที่ File ดั้งเดิมใน \\Windows\System32\en-US ของ Windows 7 เสีย แล้ว Reboot เครื่องใหม่เข้า Windows 7 แต่...ยังไม่เสร็จ ยังใช้บ่ได้ดอก อีนางเอ๊ย

ใน Windows XP นั้นเมื่อเราแก้ Shell32.dll แล้วก็ยังใช้ไม่ได้เช่นกัน เราจะต้องเข้าไปแก้ใน dllCache แล้ว Reboot ขึ้นมาใหม่แล้ว Windows XP จะจับการเปลี่ยนแปลงได้ใน dllCache แล้วก็จะใช้ได้ แต่ใน Windows 7 นั้นไม่มี dllCache โดยเปลี่ยนไปเป็น Windows Side by Side หรือที่รู้จักกันใน Folder นาม "WinSxS" แทน จึงจะไม่จับการเปลี่ยนแปลงเช่นนี้ หากแต่ต้องใช้ MUI resource cache building tool เพื่อสร้าง Cache ให้ Windows 7 ใหม่เสียก่อน

โดยหลังจากแทนที่ File ที่ต้องการเรียบร้อยและ Reboot ขึ้นมาใหม่เข้า Windows 7 แล้ว ให้เปิด Command Prompt เป็น Administrator แล้วพิมพ์คำสั่ง
   mcbuilder.exe

เมื่อรอจนเสร็จแล้วก็ให้ Reboot กลับเข้า Windows 7 อีกครั้ง "Format..." ใน Context Menu จึงจะหายไปตามที่ท่านต้องการ ส่วนจะเอากลับมาอย่างไรนั้น ลองนึกเอาเอง เชื่อว่าน่าจะทำได้เองด้วยวิธีต่างๆ (ต่างๆ แปลว่ามากกว่า 1 วิธี)

แต่หากท่านใดได้อ่านมาตั้งแต่ต้น ก็จะพบเคล็ดลับต่างๆ รวมทั้งวิธีการคิดเพื่อประยุกต์ใช้ในโอกาสต่างๆ วิธีการมองหาสิ่งที่ต้องการ และอื่นๆอีกมาก ท่านจะสามารถปรับปรุง Dialog หรือรูปแบบการแสดงผลจาก Shell32.dll ให้ออกมาเป็นอย่างไรก็ได้ หรือนำไปใช้กับ dll และ dll.mui ตัวอื่นๆดังที่ข้าน้อยนำไปใช้ในการแก้ไขหน้าตาของแผ่น Setup Windows 7 ก็ได้ แต่หากอ่านทั้งหมดแต่เพียงคร่าวๆหรือผ่านๆ ก็แค่นั้น มันจะแทบทำให้ท่านไม่ได้รู้อะไรเพิ่มขึ้นมาสักเท่าไรเลย คนแก่บ่นเสร็จแล้วแล้วก็ขอสวัสดี [emo19]

Offline microsoft

  • Administrator
  • *****
  • Posts: 8651
    • View Profile
    • VarietyPC.Net
ขอบพระคุณมากครับกับบทความทริคเยี่ยมๆอีกแล้ว

  [emo34]
การให้ที่ยิ่งใหญ่ คือ... การให้ต่อไป.... ไม่สิ้นสุด

Offline fantasy ಠ-ಠ

  • ผู้รู้ ผู้ตื่น ผู้เบิกบาน
  • N/A
  • *****
  • Posts: 4491
  • เมื่อวานรู้ วันนี้ก็รู้ แต่... พรุ่งนี้ไม่รู้
    • ICQ Messenger - 2484607
    • View Profile
    • iPlusZone.com
ท่าน ans58670 ทำให้ผมนึกถึงสมัย Window 95, 98, XP, NT4, 2000 (NT5) อะไรทำนองนั้นเลย
เพราะสมัยนั้น ผมชอบแกะ ๆ แงะ ๆ ระบบวินโดวส์อยู่บ่อย ๆ
ติดนิสัย (สันดาน) มาจากการเล่นระบบยูนิกซ์สมัยที่เรียนมหาวิทยาลับนั่นเอง
จนเมื่อมีคอมฯใช้เป็นส่วนตัว ก็เลยรู้จักลีนุกซ์ ส่วนเพื่อน ๆ ก็จะรู้จักวินโดวส์

แต่พอเริ่มใช้วินโดวส์บ่อยมากขึ้น ก็เลยเริ่ม ๆ จะลืมลีนุกซ์ แต่ก็ยังไม่ลืมการใช้คำสั่งลัดอยู่ดี
เพราะปัจจุบันนี้ เวลาลงโปรแกรม แทบไม่ได้แตะเมาส์เลย (ขี้เกียจย้ายมือไปจับเมาส์ มันเสียเวลา)

เดี๋ยวจะหาเวลาว่างมาแกะ ๆ แงะ ๆ เจ้า Seven สักหน่อย เพื่อรอรับน้องใหม่ Windows 8

... สงสัยงานนี้ฝรั่งคงจะงงกับคนไทยแน่ ๆ ที่เรียก Windows Eight ว่า Windows Egg
๕๕๕ [emo05]

Offline ans58670

  • Webmaster
  • *****
  • Posts: 2040
    • View Profile
เดี๋ยวว่างๆค่อยเอา "Windows To Go" แบบไทยๆที่ไม่ต้องใช้ "Portable Workspace Creator" ในการสร้างไปบอกใน Windows 8 ก็แล้วกัน...ฮิฮิฮิ (ความจริงขี้เกียจหา PWCreator ต่างหาก) [emo02]

Offline NicKie

  • VPC Member
  • *
  • Posts: 14
    • View Profile
ขอบพระคุณสำหรับความรู้ดีๆนะครับ


 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27