全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1214
推到 Plurk!
推到 Facebook!

請問這段程式vb改寫delphi那裏錯了呢

答題得分者是:jest0024
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-23 19:52:55 IP:220.134.xxx.xxx 未訂閱
public { Public declarations } prevWndProc : LongInt; end; var Form1: TForm1; implementation {$R *.dfm} function WndProc(WindowHandle : hWnd; Msg : LongInt; ParamW : WParam; ParamL : LParam) : LongInt ; stdcall; begin If Msg = WM_USER Then begin If ParamW = VK_F2 Then begin showmessage('你按了 F2 '); end; end; WndProc := CallWindowProc(prevWndProc, hWnd, Msg, wParam, Param) ; end; procedure TForm1.FormCreate(Sender: TObject); begin form1.Left := 0 ; Form1.Top := 0 ; // SetPriorityClass(GetCurrentProcess(),0x8000); prevWndProc := GetWindowLong(self.Handle ,GWL_WNDPROC); SetWindowLong(self.Handle , GWL_WNDPROC, @WndProc); end; 請問以上的寫法錯在那了呢? vb: From_Load() prevWndProc = GetWindowLong(Me.hWnd, GWL_WNDPROC) SetWindowLong Me.hWnd, GWL_WNDPROC, AddressOf WndProc SetKeyboardHook Me.hWnd, WM_USER end sub .bas 中的宣告 Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Declare Function SetKeyboardHook Lib "KeybHook" (ByVal hwndPost As Long, ByVal Msg As Long) As Long Declare Function ReleaseKeyboardHook Lib "KeybHook" () As Long Public prevWndProc As Long Public Ifid As String Dim IsAltDown As Boolean, IsCtrlDown As Boolean, IsShiftDown As Boolean Function WndProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long If Msg = WM_USER Then If wParam = vbKeyZ Then msgbox "你按了 Z " End If WndProc = CallWindowProc(prevWndProc, hWnd, Msg, wParam, lParam) End Function
------
xinjier禮品贈品
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-23 22:17:41 IP:203.67.xxx.xxx 未訂閱
引言:
public
    { Public declarations }
     prevWndProc : LongInt;
  end;    var
  Form1: TForm1;    implementation    {$R *.dfm}
function WndProc(WindowHandle : hWnd; Msg : LongInt; ParamW : WParam; ParamL : LParam) : LongInt ; stdcall;
  begin
    If Msg = WM_USER Then
     begin
       If ParamW = VK_F2 Then
        begin
          showmessage('你按了 F2 ');
        end;
     end;
    WndProc := CallWindowProc(Pointer(prevWndProc), hWnd, Msg, wParam, Param) ;      end;    procedure TForm1.FormCreate(Sender: TObject);
begin
  form1.Left := 0 ;
  Form1.Top := 0 ;
 //  SetPriorityClass(GetCurrentProcess(),0x8000);
      prevWndProc := GetWindowLong(self.Handle ,GWL_WNDPROC);
      SetWindowLong(self.Handle , GWL_WNDPROC, Longint(@WndProc));
end;
參數要對應正確的"型態"!!
學而時習之不亦樂乎!
hotswin
中階會員


發表:72
回覆:92
積分:52
註冊:2003-11-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-23 23:01:20 IP:220.134.xxx.xxx 未訂閱
它現在在這二行偵錯 prevWndProc := GetWindowLong(self.Handle ,GWL_WNDPROC); SetWindowLong(self.Handle , GWL_WNDPROC, LongInt(@WndProc)); Build [Error] Unit1.pas(86): Incompatible types: 'Integer' and 'Pointer' [Error] Unit1.pas(87): Variable required [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas' ------------------------- 請問是 GWL_WNDPROC 這個參數沒宣告嗎? 我試著 var GWL_WNDPROC : LongInt; 結果是一樣 以 API的原式, GWL_WNDPROC 宣告 LongInt 有錯嗎? 我在VB裏面 GWL_WNDPROC 沒有宣告就直接用了,且沒有編譯時的錯誤 請問是什麼原因呢? Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
------
xinjier禮品贈品
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-24 07:01:35 IP:203.67.xxx.xxx 未訂閱
引言:
它現在在這二行偵錯
      prevWndProc := GetWindowLong(self.Handle ,GWL_WNDPROC);
      ^--型態錯誤.
      prevWndProc := Pointer(GetWindowLong(Handle,GWL_WNDPROC));
      SetWindowLong(self.Handle , GWL_WNDPROC, LongInt(@WndProc));
      ^WndProc為內建程序,請宣告別的名稱
      fWndProc
Build [Error] Unit1.pas(86): Incompatible types: 'Integer' and 'Pointer' [Error] Unit1.pas(87): Variable required [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas' ------------------------- 請問是 GWL_WNDPROC 這個參數沒宣告嗎? 我試著 var GWL_WNDPROC : LongInt; 結果是一樣 以 API的原式, GWL_WNDPROC 宣告 LongInt 有錯嗎? 我在VB裏面 GWL_WNDPROC 沒有宣告就直接用了,且沒有編譯時的錯誤 請問是什麼原因呢? Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
學而時習之不亦樂乎! 發表人 - jest0024 於 2004/05/24 07:02:47
系統時間:2024-05-19 8:41:32
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!