noBoSoプラグイン公開のお知らせ

en_US en_USja ja
では、ソースを公開する前に、各関数の軽い説明をしておきます。
keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

keybd_event関数は、Windowsのもつ仮想キーボードにキーの状態を送信できる関数です。

詳しくはご自身でお調べください。第一引数に状態を送信するキーを入れます。

 

GetWindowText(GetForegroundWindow(), bufs, 13);

GetWindowText関数は、ウィンドウの上部に表示されるテキストを取得する関数です。

GetForegroundWindow関数とともに用いることで、現在最前面に表示されているウィンドウの名称を取得できます。

詳しくはご自身でお調べください。これを使わないと、BVEにキーが送信されないにもかかわらずキーが押されっぱなし…なんてことがあります。

 

GetKeyState(VK_CONTROL)

GetKeyState関数は、仮想キーボードの状態を取得する関数です。これを用いることによって、どのキーが押されているかを判別することができます。

詳しくはご自身でお調べください。返り値でキーの状態を判別できます。

 

MessageBox(NULL, shmsg, "[F7]無効化プログラム", MB_OK | MB_ICONERROR);

MessageBox関数は、その名の通りプログラムからMessageを伝達するために表示するBox(Window)を表示させる関数です。

第二引数に表示させるメッセージ、第三引数にウィンドウ上部に表示させるプラグラムの名称を入れます。第四引数には、そのほかウィンドウが持つ機能を入力します。

詳しくはご自身でお調べください。きっといろいろなことに応用できると思いますよ。

 

以下、今回のプログラムのソースコードです。この中の「maindo」関数をElapse関数内に、「DisposeDo」関数をDispose関数内に設置することで、本プラグインの機能を実装できます。
maindo関数に現在速度を与え忘れないように注意してください。
void DisposeDo()
{
    //Dispose内で実行
  keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
  keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}

int count = 0;
int func7 = 0;

void maindo(int Speedin)
{
  bool bveactive = false;
  char bufs[13];
  char bvets[13] = "Bve trainsim";
  GetWindowText(GetForegroundWindow(), bufs, 13);
  if (memcmp(bufs,bvets,sizeof(bvets))==0) {
    bveactive = true;
  }
  else {
    bveactive = false;
  if (bveactive==true){

    if (Speedin > 5) {
      if (GetKeyState(VK_SHIFT) <0) {
        keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      }
      if (GetKeyState(VK_CONTROL) >=0) {
        keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | 0, 0);
      }
      if (GetKeyState(VK_F7) <0) {
        keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        func7 = 1;
      }
    }
    else if (Speedin < -5) {
      if (GetKeyState(VK_CONTROL) <0) {
        keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      }
      if (GetKeyState(VK_SHIFT) >=0) {
        keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | 0, 0);
      }
      if (GetKeyState(VK_F7) <0) {
        keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
        func7 = 2;
      }
    }
    else {
      if (GetKeyState(VK_SHIFT) <0) {
        keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      }

      if (GetKeyState(VK_F7) <0) {
        keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      }
      if (GetKeyState(VK_CONTROL) <0) {
        keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
      }
    }
  }
  if (bveactive==false) {
    if (GetKeyState(VK_SHIFT) & 0x80) {
      keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }

    if (GetKeyState(VK_F7) & 0x80) {
      keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }
    if (GetKeyState(VK_CONTROL) & 0x80) {
      keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    }
  }

  if (GetKeyState(VK_F7) & 0x80 && Speedin != 0) {
    count++;
    std::string showmsg = "F7キー押下を検知 : ";
    showmsg = showmsg + std::to_string(count);
      showmsg = showmsg + " 回目\n";
      if (Speedin > 15 || Speedin <-15) {
        showmsg = showmsg + "F7は車両によって無効化されています。\n";
      }
      showmsg = showmsg + str;
      const char* shmsg = showmsg.c_str();
    MessageBox(NULL, shmsg, "[F7]無効化プログラム", MB_OK | MB_ICONERROR);
        }
  if (count > 10) {
    //exit(0);//最初は10回以上のF7押下で強制終了させようとしていた。
  }
  if (func7 == 1) {
    func7 = 0;
    keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | 0, 0);
    keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | 0, 0);
    keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);

    keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | 0, 0);
  }
  if (func7 == 2) {
    func7 = 0;
    keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | 0, 0);
    keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | 0, 0);
    keybd_event(VK_F7, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    keybd_event(VK_CONTROL, 0x00, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
    keybd_event(VK_SHIFT, 0x00, KEYEVENTF_EXTENDEDKEY | 0, 0);
  }
}

…お気づきの方もいらっしゃるかとは思いますが、実は、ATSプラグインからはいろんなことができます。例えば、簡単なところから行くと「パソコンのシャットダウン」でしょうか。

調べた感じだと、簡単に実装できそうです。

あとは、重い処理を追加することでパソコンをフリーズさせることもできなくはないと思います。

これが何を意味するかは特に言及しませんが、警戒感を持っていただければ幸いでございます。

ではでは。

Posts

BVE, Computer, Information

Posted by Tetsu Otter