如何實現I/O control 不使用視窗程式及組合語言
如題,我不要視窗程式的,組合語言的,
我只想要控制光碟機托盤的開關而已,
撥放音樂,控制旋轉速度什麼的可以不用管,
能使用什麼函式呢,有現成定義好的東西嗎?
或著你可以給我一可關鍵字or方向or網址(英文可,日文就免了).
抓到光碟機這個裝置,給他個信號,就會有所動作.
我比較想知道那個信號是什麼?
To 歌篾:
謝謝,不愧是老手呀~~
另外我想請教一下,
你知道有沒有什麼方便的東西可以代表光碟機代號的?
類似機碼內容一樣的東西:
例如:
機碼[command]中
有@="\"C:\\play\\play.exe\" %1: /l"
其中的%1:就會自動找drive的代號,
有這麼方便的東西嗎?還是要自己寫,自己定義?
#include
#include
void main(){
char DriveLetter[3]="@:"; //@為A的上個字元
char DriveName[10]="\\\\.\\@:";
int i;
for(i=1;i<26;i++){ //偵測第一台光碟機
DriveLetter[0]+=1;
DriveName[4]+=1;
if(GetDriveType(DriveLetter)==5){//偵測是否為光碟機
i=26; //如果是,跳出迴圈
}
}
HANDLE hDrive =
CreateFile(
DriveName,
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);
}
}
Yes~!
終於~~~對光碟機點右建會多出個選項用來關閉光碟機拖盤了.
(目前只適用XP,在vista下沒試過)
有興趣僅增加/移除右鍵嵌入光碟(光碟機托盤關閉)選項的,
可到這下載release:
1 個解答
- 歌篾Lv 41 0 年前最佳解答
嗯,有趣的問題。
光碟可以當檔案開啟 (請參閱微軟官方說明 - 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:\...
參考資料: 上述之微軟官方說明