Windows版RealVNCを改造して日本語キーボードに対応させる

Windows版のVNCViewerを使ってLinuxFreeBSDを遠隔操作すると、
「半角/全角」キーが利かないので、SCIMを起動させるのが面倒くさい。(Ctrl+スペースで出来るが)


RealVNCのソースを改造して、日本語キーボードに対応させる事にする。


環境:Windows XP + Visual Studio 2005 + VNC 4.1.2


以下手順

ソースを用意

RealVNCの公式サイトのダウンロードページから、Windows用のソースをダウンロードする。

ソースを修正

Visual Studio 2005ではエラーになる箇所を直す

ダウンロードしたソースを展開したら、「win\rfb_win32\SocketManager.cxx」の41行目のstaticの次にvoidを書き加える。

static void requestAddressChangeEvents(network::SocketListener* sock_) {
  DWORD dummy = 0;
  if (WSAIoctl(sock_->getFd(), SIO_ADDRESS_LIST_CHANGE, 0, 0, 0, 0, &dummy, 0, 0) == SOCKET_ERROR) {
    DWORD err = WSAGetLastError();
    if (err != WSAEWOULDBLOCK)
      vlog.error("Unable to track address changes", err);
  }
}


「win\rfb_win32\CPointer.cxx」の57行目のinlineの次に、intを書き加える。

inline int abs(int x) {return x>0 ? x : 0;}
★キーマップを加える

「win\rfb_win32\keymap.h」の一番下(Japanese stuff - almost certainly wrong... とある所)を下記の通りにする。

  // Japanese stuff - almost certainly wrong...

  { XK_Kanji,            VK_KANJI, 0 },
  { XK_Kana_Shift,       VK_KANA, 0 },
  { XK_Zenkaku_Hankaku,  VK_OEM_AUTO, 0 },
  { XK_Zenkaku_Hankaku,  VK_OEM_ENLW, 0 },
  { XK_Henkan,           VK_CONVERT, 0 },
  { XK_Muhenkan,         VK_NONCONVERT, 0 },
  { XK_Hiragana_Katakana,VK_OEM_COPY, 0 },
  { XK_Romaji           ,VK_OEM_BACKTAB, 0 },
★VNCViewerの起動中はIMEを無効化する

「win\vncviewer\DesktopWindow.cxx」の2箇所に手を加える。


imm.hをインクルードさせる。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


WM_CREATEを処理する所で、ImmAssociateContext()関数を挿入する。

  if (msg == WM_CREATE) {
    ImmAssociateContext(wnd, 0);
    SetWindowLong(wnd, GWL_USERDATA, (long)((CREATESTRUCT*)lParam)->lpCreateParams);
  } else if (msg == WM_DESTROY)

Visual Studio 2005の起動

「win\vnc.dsw」をVisual Studio 2005で開く。
すると、旧形式のVisual C++プロジェクトを変換するか聞いてくるので、「すべてはい(A)」で答える。

★設定

ツールバーの真ん中を「Release」にする。


左のソリューションエクスプローラのvncviewerで、右クリック→プロパティを選び、
構成プロパティ→リンカ→入力→追加の依存ファイルにimm32.libを追加する。

★ビルド

「F7」キーを押すとプロジェクトがビルドされる。
win\Releaseに作成されるので、この中で拡張子が「exe」と「dll」のファイルを適当な場所にコピーして使う。


後は、遠隔操作されるLinuxFreeBSDで、SCIMが「Zenkaku_Hankaku」で起動するように設定されてるか確認する。