?
Lv 4
? asked in 電腦與網際網路程式設計 · 1 decade ago

如何實現I/O control 不使用視窗程式及組合語言

如題,我不要視窗程式的,組合語言的,

我只想要控制光碟機托盤的開關而已,

撥放音樂,控制旋轉速度什麼的可以不用管,

能使用什麼函式呢,有現成定義好的東西嗎?

或著你可以給我一可關鍵字or方向or網址(英文可,日文就免了).

抓到光碟機這個裝置,給他個信號,就會有所動作.

我比較想知道那個信號是什麼?

Update:

To 歌篾:

謝謝,不愧是老手呀~~

另外我想請教一下,

你知道有沒有什麼方便的東西可以代表光碟機代號的?

類似機碼內容一樣的東西:

例如:

機碼[command]中

有@="\"C:\\play\\play.exe\" %1: /l"

其中的%1:就會自動找drive的代號,

有這麼方便的東西嗎?還是要自己寫,自己定義?

Update 2:

#include

#include

void main(){

char DriveLetter[3]="@:"; //@為A的上個字元

char DriveName[10]="\\\\.\\@:";

int i;

Update 3:

for(i=1;i<26;i++){ //偵測第一台光碟機

DriveLetter[0]+=1;

DriveName[4]+=1;

if(GetDriveType(DriveLetter)==5){//偵測是否為光碟機

i=26; //如果是,跳出迴圈

}

}

Update 4:

HANDLE hDrive =

CreateFile(

DriveName,

GENERIC_READ,

FILE_SHARE_READ | FILE_SHARE_WRITE,

NULL, OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL);

Update 5:

if (hDrive != INVALID_HANDLE_VALUE && GetLastError() == NO_ERROR){

DWORD dwDummy = 0;

// 開

DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &dwDummy, NULL);

// ...

// 關

DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, &dwDummy, NULL);

}

}

Update 6:

上面的code貼的亂亂的,

這裡有下載:

http://www.badongo.com/file/12543362

Update 7:

Yes~!

終於~~~對光碟機點右建會多出個選項用來關閉光碟機拖盤了.

(目前只適用XP,在vista下沒試過)

有興趣僅增加/移除右鍵嵌入光碟(光碟機托盤關閉)選項的,

可到這下載release:

http://www.badongo.com/file/12564128

1 Answer

Rating
  • 歌篾
    Lv 4
    1 decade ago
    Favorite Answer

    嗯,有趣的問題。

    光碟可以當檔案開啟 (請參閱微軟官方說明 - http://msdn.microsoft.com/en-us/library/aa363858(V...

    開啟之後可以用DeviceIoControl加以控制,其他控制指令,請參閱微軟官方說明 (http://msdn.microsoft.com/en-us/library/aa363216(V...

    下面是簡單的示範:

    #include <wtypes.h>

    #include <winioctl.h>

    int main()

    {

    HANDLE hDrive =

    CreateFile(

    "\\\\.\\E:", // 我的光碟是 E:

    GENERIC_READ,

    FILE_SHARE_READ | FILE_SHARE_WRITE,

    NULL, OPEN_EXISTING,

    FILE_ATTRIBUTE_NORMAL,

    NULL);

    if (hDrive != INVALID_HANDLE_VALUE && GetLastError() == NO_ERROR)

    {

    DWORD dwDummy = 0;

    // 開

    DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &dwDummy, NULL);

    // ...

    // 關

    DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, &dwDummy, NULL);

    }

    return 0;

    2008-12-18 00:33:55 補充:

    抱歉 - return 0; 之後漏了一個 }

    2008-12-19 00:29:46 補充:

    試試看下面的code,應該可以找出系統所有的光碟:

    char szDriveStrings[105];

    GetLogicalDriveStrings(105, szDriveStrings);

    char* szDriveLetter = szDriveStrings;

    while (strlen(szDriveLetter) > 0)

    {

    UINT uDriveType = GetDriveType(szDriveLetter);

    if (uDriveType == DRIVE_CDROM)

    {

    // 找到光碟

    }

    szDriveLetter += strlen(szDriveLetter) + 1;

    }

    2008-12-19 02:05:59 補充:

    不好意思,後來發你的方法是類似的,不過用GetLogicalDriveStrings()的話,可以不要一個字母一個字母試,而且讀出來時已經幫你寫好為 C:\ D:\ E:\...

    Source(s): 上述之微軟官方說明
Still have questions? Get your answers by asking now.