廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 2792 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
aniegg
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x0 鮮花 x26
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[C#] while loop問題--part3
經過一天的修改,我的程式已經接近完成,
剩下最後一個bug還沒解決--按ESC鍵離開程式。

問題描述:

我在while loop裡,加入:
if ( kbhit() ) {
if ( getch() == 27 )
break;
}
目的是當然是想按ESC鍵結束程式,但是卻無法達到目的,程式依然繼續執行while loop。

程式碼:
#include <stdio.h>
#include <dos.h ..

訪客只能看到部份內容,免費 加入會員 或由臉書 Google 可以看到全部內容



颯風沾、問途寒,誰與共飲,誰敢擋關?
燕戟歸命人不還。
獻花 x0 回到頂端 [樓 主] From:台灣 | Posted:2005-10-02 22:22 |
youchun
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x26
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我猜是因為中斷而引發的問題
試試看 if (code == <ESC scancode>) break;
先找出 <ESC scancode>
不保證有效果..


獻花 x0 回到頂端 [1 樓] From:台灣中華電信 | Posted:2005-10-02 23:02 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

為何在 int_0x09 不呼叫 oldfunc ???
還有程式結束後應該要把 interrupt 09 還回來吧? 不然結束後不會當機或不能按鍵嗎?
如果真的不想再 int_0x09 中呼叫 oldfunc, 那就應該照 youchun 的建議修改應該就可以了!
ESC scancode 好像是 01h 還是 76h? 你可以試看看!


獻花 x0 回到頂端 [2 樓] From:未知地址 | Posted:2005-10-02 23:35 |
aniegg
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x0 鮮花 x26
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

感謝大大,
程式已經沒問題了,
不過我還是很納悶,
我抓到ESC的scan code有兩個,分別是1跟81
但是只有1這個值可以讓我結束程式,而81卻不能,
到底時什麼原因,請大大說明一下,謝謝!


颯風沾、問途寒,誰與共飲,誰敢擋關?
燕戟歸命人不還。
獻花 x0 回到頂端 [3 樓] From:台灣 | Posted:2005-10-02 23:38 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

81h 是按鍵放開碼, 應該 01h 跟 81h 都可以.
你該不會直接寫 81 而不是 0x81 吧!?


獻花 x0 回到頂端 [4 樓] From:未知地址 | Posted:2005-10-02 23:45 |
aniegg
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x0 鮮花 x26
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

我直接用
      if( code==1 )
        break;
就可以成功使用ESC鍵離開程式了,
下面是我最後的程式碼,



#include <stdio.h>
#include <dos.h>
#include <conio.h>

int code, count = 0, key;

void interrupt int_0x09();
void interrupt (*oldfunc)();

void interrupt int_0x09()
{
  count++;
  key = key+50;
  code=inportb(0x60);
  sound(key);
  delay(50);
  nosound();
  outportb( 0x20, 0x20 );
}

main()
{
  clrscr ();
  oldfunc=getvect(0x09);

  printf( "Test keyboard interrupt (0x09) \n\n" );

  key=getch ();

  setvect (0x09, int_0x09);

  while ( count < 30 )
  {
      printf( "The character is entered, scan code = %x\n", code );

      delay(500);

      if( code==1 )
        break;
  }

  setvect(0x09,oldfunc);

  return 0;
}


颯風沾、問途寒,誰與共飲,誰敢擋關?
燕戟歸命人不還。
獻花 x0 回到頂端 [5 樓] From:台灣 | Posted:2005-10-02 23:57 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

請問 delay(500) 的目的為何? 有時候按鍵太快應該也會 lost 按鍵顯示吧?
還有如果沒按鍵不是也會每半秒出現一次 "The character is entered, scan code = .." 嗎?
你應該可以加一個 ReadyFlag 在 int_0x09 中設為 1
然後主程式改成 (因為按鍵不會很快, 所以不考慮 ReadyFlag 同時被設定的問題)
whlie (count < 30)
{
  if (ReadyFlag)
  {
    ReadyFlag = 0;
    printf( "The character is entered, scan code = %x\n", code );
    if (code==0x81) // 等 ESC 放開後再離開
    break;
  }
}


獻花 x0 回到頂端 [6 樓] From:未知地址 | Posted:2005-10-03 00:17 |
aniegg
數位造型
個人文章 個人相簿 個人日記 個人地圖
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x0 鮮花 x26
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

你是指
void interrupt int_0x09()
{
count++;
ReadyFlag=1;
key = key+50;
code=inportb(0x60);
sound(key);
delay(50);
nosound();
outportb( 0x20, 0x20 );
}

這樣會出現錯誤訊息:Undifined symbol 'ReadyFlag'


颯風沾、問途寒,誰與共飲,誰敢擋關?
燕戟歸命人不還。
獻花 x0 回到頂端 [7 樓] From:台灣 | Posted:2005-10-03 01:06 |
cmovies
數位造型
個人文章 個人相簿 個人日記 個人地圖
小人物
級別: 小人物 該用戶目前不上站
推文 x0 鮮花 x20
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

在程式最上面加一個變數, 如
int code, count = 0, key, ReadyFlag=0;


獻花 x0 回到頂端 [8 樓] From:未知地址 | Posted:2005-10-03 01:10 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.057168 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言