Bagaimana cara menghasilkan acara keyboard yang tidak memiliki kode kunci di Java?

Saya menggunakan kelas Robot dan kode kunci KeyEvent untuk menghasilkan semua peristiwa penting lainnya dan semuanya berfungsi dengan baik, tetapi saya juga memerlukan kunci Hangul (alihkan keyboard Korea). Rupanya KeyEvent tidak memiliki kode kunci untuk kunci ini, jadi saya buntu :( Apakah ada cara untuk membuat acara kunci Hangul ini? Apakah ada cara untuk menggunakan kode kunci Windows seperti VK_HANGUL (0x15) alih-alih KeyEvent kode kunci? Jika memungkinkan, mengubah semua kode kunci tidak akan menjadi masalah... Atau ambil peristiwa kunci sekali dan simpan secara permanen di suatu tempat dan gunakan itu selamanya...???

Apa yang saya coba lakukan adalah membuat keyboard di layar yang memiliki angka, huruf, dan bahasa Korea. Klik pada salah satu ikon dan itu akan menghasilkan peristiwa kunci dari surat yang bersangkutan sehingga surat itu diketik. (Semuanya kecuali beralih ke bahasa Korea berfungsi dengan baik.)

Mampu menghasilkan acara kunci Hangul akan menyenangkan tetapi jika itu tidak memungkinkan, apakah ada saran tentang bagaimana saya bisa mencapainya? Mungkin saya bisa mengikat setiap huruf Korea dengan alfabet yang sesuai di keyboard (misalnya g adalah ㅎ pada keyboard konvensional yang memiliki bahasa Inggris dan Korea) atau semacamnya, tetapi lalu bagaimana cara mengirimkannya ke aplikasi lain?

Maaf jika pertanyaan ini tersebar kemana-mana. Aku benar-benar tersesat.


person Jade    schedule 10.12.2014    source sumber
comment
Ini mungkin membantu Anda. Tidak menandai sebagai duplikat karena tampaknya bukan duplikat (kunci sebenarnya vs interpretasi Unicode). stackoverflow.com/questions/397113/ Saya tidak 100% paham dengan Robot atau Hangul jadi saya tidak yakin apakah ada yang menafsirkan unicode.   -  person Compass    schedule 11.12.2014
comment
Terima kasih telah berkomentar! Menggunakan kode alt seperti pada tautan Anda sebenarnya adalah ide yang bagus. Namun, Anda perlu menahan 'Alt' lalu pergi ke numpad dan tekan '+' dan digit Unicode hex lainnya, bukan? Bagaimana caranya agar robot menekan tombol NUMPAD '+'? Saya mencoba SHIFT= tetapi tidak berhasil...   -  person Jade    schedule 11.12.2014
comment
stackoverflow.com/questions/15605109/java-keybinding-plus-key Aku tidak begitu mahir dengan peristiwa-peristiwa penting, tapi sepertinya ini akan berhasil   -  person Compass    schedule 11.12.2014
comment
Selain itu, karena cara bahasa Korea, (satu huruf biasanya merupakan kombinasi 2-3 karakter jika masuk akal, seperti 한 adalah ㅎ+ㅏ+ㄴ, ada ribuan kombinasi) memetakan setiap huruf menggunakan unicode sangat sulit .   -  person Jade    schedule 11.12.2014
comment
Memberi penundaan sepertinya tidak mengubah apa pun...   -  person Jade    schedule 11.12.2014
comment
aku bingung, kalau begitu :(   -  person Compass    schedule 11.12.2014
comment
Terima kasih telah membantu :)   -  person Jade    schedule 11.12.2014


Jawaban (1)


Saya menemukan satu solusi untuk masalah ini. Saya menggunakan JNA untuk menghasilkan acara keyboard.

Berikut beberapa kode jika ada yang membutuhkannya.

Hal-hal dasar untuk menggunakan metode JNA dan keybd_event dari 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;

Dan kemudian masukkan ini di mana Anda perlu membuat acara utama:

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

0x15 dan 0xF2 adalah kode kunci virtual dan kode pindaian keyboard untuk tombol alih Hangul/Bahasa Inggris yang saya cari, tetapi carilah kode untuk kunci apa pun yang Anda perlukan lalu gantikan, dan Anda dapat menghasilkan hampir semua peristiwa penting.

Anda memerlukan jna.jar dan platform.jar agar ini berfungsi.

person Jade    schedule 12.12.2014
comment
menggunakan JNA untuk tugas jenis ini kemungkinan besar akan merusak fungsionalitas Anda di masa mendatang. WINAPI berubah dengan cepat saat ini, menghubungkan bytecode Anda ke kode mesin memerlukan pengujian terus-menerus pada semua platform target Anda - dan pada titik tertentu bahkan menulis ulang, dengan primitif konstan (seperti yang Anda gunakan) ini mungkin bekerja sedikit lebih lama sejak itu microsoft tidak sering mengubah konstanta - tetapi itu AKAN terjadi, itulah mengapa mereka memperkenalkan makro asli untuk ini, mereka akan selalu memetakan ke primitif yang benar. - person specializt; 12.12.2014
comment
Ya, itu sejalan dengan apa yang saya khawatirkan pada awalnya, itulah sebabnya saya menulis solusi 'satu' dan bukan solusi 'yang'. Akhirnya saya pikir itu tidak masalah dalam kasus saya karena ini hanya proyek semester panjang. Namun, bisakah Anda memberi tahu saya lebih banyak tentang makro asli? Saya tidak tahu mereka ada. Kata kunci apa yang harus saya cari untuk mendapatkan informasi tentang hal tersebut? - person Jade; 13.12.2014
comment
ikhtisar singkat : msdn.microsoft.com/en-us/library/b0084kay.aspx. Sebagian besar dari puluhan ribu makro bersifat spesifik fungsi, makro tersebut selalu disebutkan dan dijelaskan di setiap fungsi yang menggunakannya - beberapa orang mungkin menyebutnya sebagai konstanta parameter, dalam kasus Anda : msdn.microsoft.com/en-us/library/windows/desktop/ dan khususnya msdn .microsoft.com/en-us/library/windows/desktop/ -- biasanya lebih baik menulis aplikasi asli untuk tugas semacam ini, dengan mengikuti semua standar microsoft saat melakukannya. - person specializt; 13.12.2014
comment
@specializt Terima kasih! - person Jade; 13.12.2014