none
c# 如何用程式碼去模擬滑鼠動作 RRS feed

解答

  • 那我會建議你先利用 PC 測試專案,在本機寫一個滑鼠拖拉的選擇框,等玩熟了,再把測試專案移到你現在的專案。

     

    選擇框能不用公用暫存變數你這邊就可以順利的轉移,我自己寫選擇框之前測過,沒有暫存變數會有你說的情形,因為事件發生的順序不是你想的那樣,比如說你說座標值會一直輸入兩次以上,就是事件不斷的觸發。

    2008年8月8日 上午 03:09

所有回覆

  • HI,

     

    您可以參考以下的做法:

    http://bytes.com/forum/thread269586.html

     

    tihs

    2008年8月5日 上午 03:34
  • 其實有一個非常麻煩的問題就是BufferedStream的問題

    BufferedStream可以一次寫入一唯陣列的多個元素嗎?

    我自已做了一個小試驗,只有實作滑鼠在做水平左右移動

     

    發送端:

    Code Snippet

    protected override void OnMouseMove(MouseEventArgs e)

    {

      int[] position = new int[2] {e.X , e.Y};      //存放座標到陣列

         try
          {
             System.IO.Stream position_x1 = bc.GetStream();
             position_x1.Write(BitConverter.GetBytes(position[0]), 0, position.Length);

             System.IO.Stream position_x2 = bc.GetStream();
             position_x2.Write(BitConverter.GetBytes(position[0]), 0, position.Length);

           }

         catch
          {
          }

    }

     

     

     

    接收端:

    Code Snippet

    private void ListenLoop()

    {

                byte[] buffer1 = new byte[4];
                int received1 = 0;
                byte[] buffer2 = new byte[4];
                int received2 = 0;

        while(listening)
         {

                    System.IO.Stream position_x1;
                    System.IO.Stream position_x2;
           try
              {
                        bc = bl.AcceptBluetoothClient();
                        position_x1 = bc.GetStream();
                        position_x2 = bc.GetStream();
              }
           catch
              {
                       break;
              }

                           

                  received1 = position_x1.Read(buffer1, 0, buffer1.Length);
                  received2 = position_x2.Read(buffer2, 0, buffer2.Length);

                     

                  //x1:第一個得到的x座標,x2:第二個得到的x座標

                   int x1 = (BitConverter.ToInt16(buffer1, 0));
                   int x2 = (BitConverter.ToInt16(buffer1, 1));

                   int x = x2 - x1;

     

                if (x > 0)
                Cursor.Position = new Point(Cursor.Position.X - 5, Cursor.Position.Y +0);
                if (x < 0)
                Cursor.Position = new Point(Cursor.Position.X + 5, Cursor.Position.Y + 0);

    }

     

     

     

    但是做出來都是無論輸入什麼

    滑鼠都一直往右邊移動

    我現在比較不會的地方 就是不知如何使用BufferedStream去輸入及抓出正確的值

    不知有沒有比較容易懂的方式 謝謝

    2008年8月5日 下午 05:01
  • ... 你問 BufferedStream ,但程式碼裡面沒有阿。

     

    若是問 .Net Stream 裡面的相關方法,是不能直接處理物件或陣列,我自己的慣例是在類別或結構裡面加 ToArray 的方法轉成 Byte()

     

    2008年8月6日 下午 05:47
  • 由於我是初學者
    可能連問題都不太會問
    由於我的問題在書上也找不到
    只能上來問一些資深的前輩
    我在網路上有看到國外有作者開發了藍芽的API
    他是使用System.IO.Stream去達到傳送/接收訊息
    而且有提供了一個簡易的sample
    以下為程式碼:


    發送端:

    Code Snippet

    //turn on bt radio
    BluetoothRadio.PrimaryRadio.Mode = RadioMode.Connectable;
    bc = new BluetoothClient();

    System.IO.Stream s = bc.GetStream();
    s.Write(BitConverter.GetBytes((short)e.KeyCode), 0, 1);

     

     

     

    接收端:

    Code Snippet

    private void ListenLoop()
    {
     byte[] buffer = new byte[4];
     int received = 0;

     while(listening)
     {
      BluetoothClient bc;
      System.IO.Stream ns;
       try
       {
        bc = bl.AcceptBluetoothClient();
        ns = bc.GetStream();
       }
       catch
       {
        break;
       }
      if(received > 0)
      {
       string command = "";

        Keys keycode = (Keys)BitConverter.ToInt16(buffer, 0);
          
         switch(keycode)
         {
         }
      }
     }
    }

     

     

     

    而我想從這個程式
    去修改成我可以送出滑鼠的訊號
    然後接收
    但是System.IO.Stream
    好像沒辦法同時送入兩個以上的數值(因為座標有x,y)
    他的範例是送出keycode只有一個值
    所以一直搞不定
    希望有前輩可以指點如何做出
    謝謝

    2008年8月7日 上午 11:13
  • 我建議你先明確的按照步驟列出你要做甚麼,不要把範例程式碼跟你要做的事情混在一起說,什麼地方要傳到什麼地方請說清楚,你混在一起說根本不知道你到底要幹嘛。

    2008年8月7日 上午 11:54
  • 這是在ppc手機的程式
    OS是windows mobile 6
    透過藍芽送訊號給PC
    然後當我的PDA手機上觸控面版有用手摸到
    便會送訊號給PC(PC端有也裝接收程式)

    我想透過一連串的座標變化
    然後就可以使pc端的座標跟著動

    而提供藍芽api的作者
    他所用的方式是使用System.IO.Stream.write在手機寫入資料

    Stream透過藍芽的傳輸
    讓pc端也使用System.IO.Stream.read接收
    但是 座標會一直輸入兩值以上
    在System.IO.Stream好像沒辦法同時傳送兩個值出去
    我試著用兩次的System.IO.Stream去傳送兩次x座標值

    試圖想藉由差值而水平移動(也確定滑鼠會移動)
    但是後面的傳會把前面的值給覆蓋而造成抓值錯誤(每次pc端都收到第二個值)

    我有想過一個方法就是在pc端使用陣列去儲存手機端每次傳送的值

    如此便不會有後來的值蓋住前面的值而抓錯
    但是不知如何做出來

    2008年8月7日 下午 08:15
  • 那我會建議你先利用 PC 測試專案,在本機寫一個滑鼠拖拉的選擇框,等玩熟了,再把測試專案移到你現在的專案。

     

    選擇框能不用公用暫存變數你這邊就可以順利的轉移,我自己寫選擇框之前測過,沒有暫存變數會有你說的情形,因為事件發生的順序不是你想的那樣,比如說你說座標值會一直輸入兩次以上,就是事件不斷的觸發。

    2008年8月8日 上午 03:09
  • 您說的沒錯是事件不斷的觸發
    我已經先使用測試專案
    從pda手機送出座標
    而在pc端使用messagebox來檢查得到的座標值
    目前已順利每次在pda手機螢幕按一下都在會pc的螢幕show出正確的座標值
    現在只有檢查每次的後面的座標值比對前一次的座標值
    來做出在pc端滑鼠的移動了

    非常感謝心冷熱情熄 大大不倦的回答我的問題

    2008年8月8日 上午 03:22