ฉันจะสร้างกิจกรรมคีย์บอร์ดที่ไม่มีรหัสคีย์ใน Java ได้อย่างไร

ฉันใช้คลาส Robot และรหัสคีย์ KeyEvent เพื่อสร้างเหตุการณ์สำคัญอื่น ๆ ทั้งหมดและทำงานได้ดี แต่ฉันก็ต้องใช้คีย์อังกูลด้วย (สลับแป้นพิมพ์ภาษาเกาหลี) เห็นได้ชัดว่า KeyEvent ไม่มีรหัสคีย์สำหรับคีย์นี้ ดังนั้นฉันจึงติดอยู่ :( มีวิธีสร้างเหตุการณ์คีย์อังกูลนี้หรือไม่ มีวิธีใช้รหัสคีย์ของ Windows เช่น VK_HANGUL (0x15) แทน KeyEvent รหัสคีย์ หากเป็นไปได้การเปลี่ยนรหัสคีย์ทั้งหมดก็ไม่ใช่ปัญหา...หรือนำเหตุการณ์สำคัญไปใช้ครั้งเดียวและเก็บไว้ที่ไหนสักแห่งอย่างถาวรและใช้สิ่งนั้นตลอดไป...???

สิ่งที่ฉันพยายามทำคือสร้างแป้นพิมพ์บนหน้าจอที่มีตัวเลข ตัวอักษร และภาษาเกาหลี คลิกที่ไอคอน จากนั้นจะสร้างเหตุการณ์สำคัญของตัวอักษรที่เกี่ยวข้องเพื่อพิมพ์ตัวอักษร (ทุกอย่างยกเว้นการเปลี่ยนเป็นภาษาเกาหลีทำงานได้อย่างถูกต้อง)

ความสามารถในการสร้างเหตุการณ์คีย์อังกูลคงจะดี แต่ถ้าเป็นไปไม่ได้ มีข้อเสนอแนะใด ๆ เกี่ยวกับวิธีที่ฉันจะบรรลุเป้าหมายนี้หรือไม่ บางทีฉันอาจจะผูกตัวอักษรเกาหลีแต่ละตัวเข้ากับตัวอักษรที่สอดคล้องกันบนคีย์บอร์ดได้ (เช่น g คือ ㅎ บนคีย์บอร์ดธรรมดาที่มีทั้งภาษาอังกฤษและภาษาเกาหลี) หรืออะไรสักอย่าง แต่ฉันจะส่งมันไปยังแอพพลิเคชั่นอื่นได้อย่างไร

ขออภัยหากคำถามนี้แพร่หลายไปทั่ว ฉันแค่หลงทางจริงๆ


person Jade    schedule 10.12.2014    source แหล่งที่มา
comment
สิ่งนี้อาจช่วยคุณได้ ไม่ทำเครื่องหมายว่าซ้ำกันเนื่องจากไม่ปรากฏว่าซ้ำกัน (คีย์จริงเทียบกับการตีความ Unicode) stackoverflow.com/questions/397113/ ฉันไม่คุ้นเคยกับ Robot หรือ Hangul 100% ดังนั้นฉันจึงไม่แน่ใจว่ามี Unicode ที่ตีความหรือไม่   -  person Compass    schedule 11.12.2014
comment
ขอบคุณสำหรับความคิดเห็น! การใช้โค้ด alt เหมือนในลิงก์ของคุณเป็นความคิดที่ดีจริงๆ อย่างไรก็ตาม คุณต้องกด 'Alt' ค้างไว้แล้วไปที่ numpad แล้วกด '+' และตัวเลขอื่นๆ ของ Unicode hex ใช่ไหม ฉันจะทำให้หุ่นยนต์กดปุ่ม NUMPAD '+' ได้อย่างไร ฉันลอง SHIFT= แล้ว แต่มันใช้งานไม่ได้...   -  person Jade    schedule 11.12.2014
comment
stackoverflow.com/questions/15605109/java-keybinding-plus-key ฉันไม่ค่อยเก่งกับเหตุการณ์สำคัญ แต่ดูเหมือนว่าจะได้ผล   -  person Compass    schedule 11.12.2014
comment
นอกจากนี้ เนื่องจากวิธีการใช้ภาษาเกาหลี (ตัวอักษรหนึ่งตัวมักจะประกอบด้วยอักขระ 2-3 ตัวหากสมเหตุสมผล เช่น ฮัน คือ ㅎ+ㅏ+ㄴ มีอักขระรวมกันนับพันตัว) การแมปทุกตัวอักษรโดยใช้ยูนิโค้ดเป็นเรื่องยากจริงๆ .   -  person Jade    schedule 11.12.2014
comment
คุณมีความล่าช้าหรือไม่? stackoverflow.com/questions/14595483/   -  person Compass    schedule 11.12.2014
comment
การให้ล่าช้าก็ดูไม่เปลี่ยนแปลงอะไร...   -  person Jade    schedule 11.12.2014
comment
ฉันนิ่งงันแล้ว :(   -  person Compass    schedule 11.12.2014
comment
ขอบคุณที่ช่วยอยู่แล้ว :)   -  person Jade    schedule 11.12.2014


คำตอบ (1)


ฉันพบวิธีแก้ไขปัญหาหนึ่งวิธี ฉันใช้ JNA เพื่อสร้างเหตุการณ์แป้นพิมพ์

นี่คือโค้ดบางส่วนเผื่อมีใครต้องการ

สิ่งพื้นฐานสำหรับการใช้วิธี JNA และ keybd_event จาก User32.dll:

import com.sun.jna.*;    
import com.sun.jna.Native;    
import com.sun.jna.platform.win32.User32;
import com.sun.jna.win32.StdCallLibrary;    
public interface User32jna extends User32 {
 User32jna INSTANCE = (User32jna) Native.loadLibrary("user32.dll",User32jna.class);
 public void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
}
User32jna u32 = User32jna.INSTANCE;

จากนั้นแทรกส่วนนี้ในตำแหน่งที่คุณต้องการสร้างเหตุการณ์สำคัญ:

u32.keybd_event((byte) 0x15,(byte)0xF2,0,0);

0x15 และ 0xF2 เป็นรหัสคีย์เสมือนและรหัสสแกนแป้นพิมพ์สำหรับปุ่มสลับอังกูล/อังกฤษที่ฉันกำลังมองหา แต่ค้นหารหัสสำหรับรหัสใดก็ตามที่คุณต้องการแล้วแทนที่รหัสเหล่านั้น และคุณสามารถสร้างเหตุการณ์สำคัญใดๆ ก็ได้

คุณจะต้องมี jna.jar และ platform.jar เพื่อให้สิ่งนี้ทำงานได้

person Jade    schedule 12.12.2014
comment
การใช้ JNA สำหรับงานประเภทนี้มักจะทำให้ฟังก์ชันการทำงานของคุณเสียหายในอนาคต WINAPI เปลี่ยนแปลงอย่างรวดเร็วในปัจจุบัน การเชื่อมโยงไบต์โค้ดของคุณเข้ากับโค้ดเครื่องอย่างหนักนั้นจำเป็นต้องมีการทดสอบอย่างต่อเนื่องบนแพลตฟอร์มเป้าหมายทั้งหมดของคุณ - และในบางครั้งถึงกับเขียนใหม่ด้วยการใช้พื้นฐานคงที่ (เช่นที่คุณใช้อยู่) สิ่งนี้อาจทำงานได้นานกว่าเล็กน้อยเนื่องจาก microsoft ไม่ได้เปลี่ยนค่าคงที่บ่อยครั้ง - แต่มันจะเกิดขึ้น นั่นเป็นเหตุผลว่าทำไมพวกเขาถึงแนะนำมาโครเนทิฟสำหรับสิ่งเหล่านี้ พวกมันจะแมปกับค่าดั้งเดิมที่ถูกต้องเสมอ - person specializt; 12.12.2014
comment
ใช่ นั่นสอดคล้องกับสิ่งที่ฉันกังวลในตอนแรก ซึ่งเป็นสาเหตุที่ฉันเขียนโซลูชัน 'หนึ่ง' แทนที่จะเป็นโซลูชัน 'นั้น' ในที่สุดฉันก็คิดว่ามันไม่สำคัญในกรณีของฉันเพราะนี่เป็นเพียงโปรเจ็กต์ระยะยาวภาคเรียนเท่านั้น อย่างไรก็ตาม คุณช่วยบอกฉันเพิ่มเติมเกี่ยวกับมาโครดั้งเดิมได้ไหม ฉันไม่รู้ว่าพวกมันมีอยู่จริง ฉันควรค้นหาคำหลักใดเพื่อรับข้อมูลเกี่ยวกับสิ่งเหล่านั้น - person Jade; 13.12.2014
comment
ภาพรวมโดยย่อ: msdn.microsoft.com/en-us/library/b0084kay.aspx. มาโครนับหมื่นส่วนใหญ่เป็นฟังก์ชั่นเฉพาะ โดยจะมีการกล่าวถึงและอธิบายในแต่ละฟังก์ชั่นที่ใช้มาโครอยู่เสมอ - บางคนอาจเรียกมันว่าเป็นค่าคงที่พารามิเตอร์ ในกรณีของคุณ : msdn.microsoft.com/en-us/library/windows/desktop/ และโดยเฉพาะ msdn .microsoft.com/en-us/library/windows/desktop/ -- โดยปกติแล้ว การเขียนแอปแบบเนทีฟสำหรับงานประเภทนี้จะดีกว่ามาก โดยยึดตามมาตรฐาน Microsoft ทั้งหมดในขณะที่ทำเช่นนั้น - person specializt; 13.12.2014
comment
@specializt ขอบคุณ! - person Jade; 13.12.2014