討論區快速選單
知識庫快速選單
Excel也能做到大數據分析? 網路投保旅行平安險
[ 回上頁 ] [ 討論區發言規則 ]
在VC++.NET中使用API的問題
更改我的閱讀文章字型大小
作者 : x2163126(吃冬瓜補西瓜)
[ 貼文 38 | 人氣 0 | 評價 20 | 評價/貼文 0.53 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/11/23 下午 02:58:30
是這樣的,我之前要使用API都會這樣用

[DllImport("user32.dll", EntryPoint="FindWindow")]
extern "C" int FindWindow (String^ lpClassName,String^ lpWindowName);

那像我現在要用GetClientRect

[DllImport("user32.dll", EntryPoint="GetClientRect")]
extern "C" int GetClientRect(IntPtr hWnd ,LPRECT lpRect);

語法錯誤 : 識別項 'LPRECT'
這樣卻是錯的!!

1.我要使用API都要這麼麻煩嗎,我include <windows.h>也不能直接使用API

2.假如我要用一個新的API,我該如何找他的宣告
然後使用他
作者 : x2163126(吃冬瓜補西瓜)
[ 貼文 38 | 人氣 0 | 評價 20 | 評價/貼文 0.53 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/11/23 下午 03:14:54
//宣告一個RECT
public struct RECT {
public uint Left;
public uint Top;
public uint Right;
public uint Bottom;
}
 
//C#的宣告
[DllImport("user32")]
public static extern bool GetClientRect(
IntPtr hwnd,
out RECT lpRect
);
 
//設定一個RECT
RECT rec = new RECT();
 
bool rtvl;
 
//取得目前執行視窗的工作區大小
rtvl = GetClientRect(this.Handle, out rec);

以上是C#的用法,但我要改成VC++.NET winform的版本
我該如何做
作者 : chiuinan2(青衫)討論區板主 Visual C++ .NET卓越專家VC++一代宗師Visual Basic優秀好手資訊類作業求救卓越專家一般曠世奇才程式設計甘苦談優秀好手C++ Builder優秀好手上班族的哈拉園地優秀好手C++頂尖高手Assembly優秀好手貼文超過3000則人氣指數超過150000點
[ 貼文 3732 | 人氣 170106 | 評價 34520 | 評價/貼文 9.25 | 送出評價 125 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/11/23 下午 05:13:04

原則上, 既然使用.net的寫法, 就儘量少用unmanaged code, 除非有特別的必要.

例如GetClientRect函數可用Form的ClientRectangle屬性讀取來達成:

Rectangle rc = ClientRectangle;

如果非要使用unmanaged code, 最好集中在另一個程式檔, 因為傳統的Windows API與.net寫法是不太相容的, 硬要湊在一起, 寫起來會變得非常困難. 在unmanaged code程式檔裡, 你可以直接#include <windows.h>, 然後使用所有想用的API (別再使用using等等managed code的寫法). 例如:

#include "stdafx.h"
#include <windows.h>

void test(void)
{
   HWND h = FindWindow(L"test1",L"test2");
   RECT rc;
   GetClientRect(h,&rc);
}

傳統所有的API, 或是其他第三方傳統lib的程式, 都可以採用這種方式引入.

最後記得到專案屬性->連結器->輸入->其他相依性, 加入user32.lib (看用那些API).
作者 : x2163126(吃冬瓜補西瓜)
[ 貼文 38 | 人氣 0 | 評價 20 | 評價/貼文 0.53 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2011/11/23 下午 05:44:47
= = 我已經感覺到困難了,因為幾乎都自己在摸索
using namespace System::Runtime::InteropServices;

[DllImport("user32.dll", EntryPoint="FindWindow")]
extern IntPtr FindWindow (String^ lpClassName,String^ lpWindowName);

[DllImport("user32.dll", EntryPoint="GetClientRect")]
extern IntPtr GetClientRect(IntPtr hWnd, IntPtr lpRect);

[DllImport("user32.dll", EntryPoint="ClientToScreen")]
extern HWND ClientToScreen(IntPtr hWnd,IntPtr lpPoint);

....省略....

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) {
//IntPtr hwd1 ;
IntPtr hwd1;
hwd1 = ::TestFindWindow::FindWindow(nullptr,"小算盤");//"CabinetWClass"
if(hwd1 != IntPtr::Zero){
::TestFindWindow::MessageBox::Show("找到了!!找到了");
}
else {
::TestFindWindow::MessageBox::Show("請開啟小算盤");
}

Point ^pt;
Rect ^rc=gcnew Rect();

::TestFindWindow::GetClientRect(hwd1,rc->kk);

for(int y=rc->Top;y<rc->Bottom;y++){
for(int x=rc->Left;x<rc->Right;x++){
pt->Y=y;
pt->X=x;
::ClientToScreen(hwd1, pt); // 將小算盤 client window 座標換算成 Root 視窗的位置(絕對位置)
::SetCursorPos(pt->X, pt->Y); // 移動滑鼠到指定的絕對位置
}
}
}
Point Rect都是另外建立class

錯誤: 'ClientToScreen' : 無法將參數 1 從 'System::IntPtr' 轉換成 'HWND'

作者 : chuzt(我愛老婆)
[ 貼文 34 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 7 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2012/12/20 下午 04:16:31
雖然我無法對問題提出任何看法、建議。因為我剛接觸VC++

但這篇討論的內容,確實對新手有不少觀念上的幫助,由其是青杉前輩解說的部份。

不知道是否有更多關於這種混合使用的說明? 教學或注意事項之類的
 板主 : 徵求中
 > Visual C++ .NET - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual C++ .NET - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual C++ .NET
1 青衫 2220 
2 Raymond 1500 
3 joe 520 
4 冷眼 350 
5 CodeWarrior 260 
6 marlon 230 
7 小朱 210 
8 windblown 200 
9 XWLin 120 
10 小約翰 120 
Visual C++ .NET
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.03125