2014-12-07 60 views
-1

你好我做在delphi XE2的功能,關閉顯示器,我做它在一個控制檯應用程序,他在一個圖形應用程序做了沒有問題,但是當你踏進控制檯應用程序給了我這些錯誤:關閉監視器控制檯與德爾福XE2

Undeclared identifier: 'Application' 
Undeclared identifier: 'WM_SYSCOMMAND' 

來源:

program test; 

{$APPTYPE CONSOLE} 
{$R *.res} 

uses 
    System.SysUtils,ShellApi,Windows; 

function turn_off(): string; 
const 
    MONITOR_ON = -1; 
    MONITOR_OFF = 2; 
    MONITOR_STANDBY = 1; 
begin 
    SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF); 
end; 

begin 
    try 
    turn_off(); 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 

,我可以在一個控制檯應用程序做到這一點?

+1

嗯,首先,因爲它是一個控制檯應用程序,'Application.Initialize'和'Application.Run'永遠不會被調用。另外,你甚至在你的'用法'中沒有必要的單位。但這不會自動解決您的問題。你的問題的基礎是你需要傳遞一個合適的句柄來發送消息。不幸的是我無法在我的環境中測試這個,因爲我的IDE是通過遠程桌面進行的,因此我不想冒着不可預知的結果冒着不在IDE前面的機器:-)但是'Application'駐留在'形式'單位。 – 2014-12-07 02:36:52

+0

'Application'在'Forms'單元中聲明,它不在你的uses子句中。控制檯應用程序默認沒有消息循環,也沒有窗口句柄,所以沒有什麼可以使用'SendMessage'。控制檯應用程序沒有'Application'來初始化或運行。 – 2014-12-07 04:09:06

+0

然後我不能在控制檯中做到這一點? – adsdsa 2014-12-07 04:44:29

回答

3

未說明的標識符:「應用」 未說明的標識符WM_SYSCOMMAND'

未說明的標識符只是意味着命名的標識符沒有被這個程序中聲明。在這種情況下,您缺少uses子句中的兩個單元。 ApplicationVcl.Forms中聲明,WM_SYSCOMMANDWinapi.Messages中聲明。添加這些單位來處理你的編譯錯誤。

當你這樣做,你會發現,Application.Handle0。所以你的代碼將無法做任何事情。您需要將消息發送到一個真實的窗口。如果你使用VCL,那麼我想你可以創建一個隱藏的表單。

我不知道你是否真的需要一個控制檯這裏。也許你真的想要一個GUI子系統應用程序,一旦它完成工作就終止。

你並不需要使用ShellAPI和你turn_off函數不返回任何東西。

我也懷疑這裏使用VCL。最終你會得到一個令人難以置信的胖程序來完成這樣一項微不足道的任務。我個人會創建一個窗口,呼叫CreateWindow並在那裏發送消息。