• ベストアンサー

ハンドルからインスタンス?を取得したいのですが

CreateWindowExを使いたいのですが 途中でインスタンス?(でいいのかな?)を指定するところが あるのですがどうしていいか困っています。 GetWindowLong(HWND,GWL_HINSTANCE); でとれるのかな?と思うのですが 返す値がLongです インスタンスにキャストすることなどできるのでしょうか? どのようにしたらいいのでしょうか? インスタンス自身もあまり意味が....... よろしくお願いいたします

  • gotyan
  • お礼率91% (172/188)

質問者が選んだベストアンサー

  • ベストアンサー
  • hurce
  • ベストアンサー率66% (2/3)
回答No.1

(HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE) でよいです。 HINSTANCEもLONGも32bitの変数だからキャストしてもだいじょうぶです。

gotyan
質問者

お礼

ありがとうございます 同じLONG値なんですねやってみます

その他の回答 (1)

  • kmb01
  • ベストアンサー率45% (63/138)
回答No.2

HINSTANCEはexe,dllがロードされた先頭アドレスです。 仮想アドレスなので大抵いつも同じ値になっていると思います。 あと、同じ32bitだからキャストしてもよいというわけではなく、GetWindowLong(HWND,GWL_HINSTANCE)がキャストして使用されることを想定したものであるのだとおもいます。

gotyan
質問者

お礼

ありがとうございます インスタンスって先頭のアドレスだったんですね 勉強になります

関連するQ&A

  • VC++コンソールアプリでのインスタンスハンドルの取得

    VC++コンソールアプリでのインスタンスハンドルの取得 VC++コンソールアプリケーションでインスタンスハンドルを取得しようとしているのですが、 HINSTANCE hi = (HINSTANCE)GetWindowLong(HWND_DESKTOP, GWL_HINSTANCE); を実行すると、NULLが戻ってきます。 どこかまずい部分があるのでしょうか。 なお、第一引数のウィンドウハンドルは不明なため、 いくつかのWebサイトに習い、HWND_DESKTOPを指定しました。

  • CREATESTRUCT と GetWindowLong

    HINSTANCE hInst; CREATESTRUCT *lpcrea; lpcrea = (CREATESTRUCT *)lParam; hInst = lpcrea->hInstance; と HINSTANCE hInst; hInst = (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE); は、どういう意味なのか、どこが違うのか教えてください。 メインのウインドウのインスタンスをグローバル宣言して いなかった場合に、プロージャ内でメインのウインドウの インスタンスを得ているんだと思うんだけど、細かい部分の 説明をしてほしいです。

  • C言語でのEDITコントロールからの数字の取得について質問があります。

    C言語でのEDITコントロールからの数字の取得について質問があります。 case WM_CREATE: hwndTempo = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT") , TEXT("120") , WS_CHILD | WS_VISIBLE | ES_LEFT | ES_NUMBER , 0 , 0 , 200 , 30 , hWnd, (HMENU)3, (HINSTANCE)GetWindowLong(hWnd, GWL_HINSTANCE) , NULL); break; このようにEDITコントロールを作成したとき、どのように書かれている数字(初期設定では120)を取得することができるのでしょうか? ためしに文字型で取得してから変換しようと思い、 ボタンを押した時の処理として char szEdit1[128]; GetDlgItemText(hWnd, hwndTempo, szEdit1,64); と入力してみたのですが、 「error C2664: 'GetDlgItemTextW' : 2 番目の引数を 'HWND' から 'int' に変換できません。」 となってしまいました。 最近始めたばかりでインスタンスやウィンドウハンドルの指定などが間違っているのではないかと思いますが、いまひとつよくわかりません。 「GetDlgItemText」の行をコメントアウトすればエディットとボタンコントロールは正常に表示されます。 開発環境がVisual C++ 2008 Express Editionであるため、リソースエディタは使っていません。 サンプルの多くがIDC_EDIT1を使っているのでどう参考にすればよいか良く見えません。 この方法を学習したら「GetDlgItemInt」を使って直接取得してみる予定です。 出来れば単純なサンプルソースを提示していただけると助かります。 ではよろしくお願いします。

  • GetModuleFileName(他のアプリ, buf, 255);

    HINSTANCE hInst; hInst = (HINSTANCE)GetWindowLong(hWndElse, GWL_HINSTANCE); GetModuleFileName(hInst, buf, 255); というソースで、buf[0] が 0 でした。 GetWindowText( ) のように、GetModuleFileName( ) も 他のアプリに対しては 0 を返すんですか?

  • ダイアログボックスで指定したサイズどおり表示されない

    ダイアログボックスで指定したサイズがメイン上では約2倍の大きさになって表示されてしまい、困っています。 メニューリソースは以下のとおりです。 MYDLG DIALOG DISCARDABLE 25, 50, 100, 150 STYLE WS_VISIBLE | WS_CHILD | DS_CONTROL CAPTION "Dialog" FONT 9, "MS Pゴシック" BEGIN END WndProc内にダイアログを貼り付けています。 if(hDlgWnd) break; hDlgWnd = CreateDialog((HINSTANCE)GetWindowLong(hWnd,GWL_HINSTANCE),"MYDLG",hWnd,DialogProc); それが実際にウィンドウを開くとダイアログがだいたいですが(50,115,200,340)のように表示されてしまいます。 VC++ Ver.6.0です。コンパイラ等の問題でしょうか。 ご存知の方、宜しくお願いします。

  • WindowsAPIの、ウインドウの表示非表示

    WindowsAPIのCreateWindowEx関数で作った 例えば第一引数が WS_EX_TOOLWINDOW|WS_EX_TOPMOST で第四引数が WS_SYSMENU | WS_VSCROLL | WS_SIZEBOX のウインドウを、何かのアクションがあったときいったん非表示にしてから、また何かのアクションがあった時に表示させるには、どのような物を使うのがベストなのでしょうか? プロシージャ内(HWNDはhw)で一例として(…?)試しに以下だけのものでやってみると long lStyle = GetWindowLong(hw, GWL_STYLE); lStyle = ~WS_VISIBLE; SetWindowLong(hw, GWL_STYLE, lStyle); 確かに非表示扱いにはなるようなのですが、これだけではスクリーンは再描画されず、再描画されるには人為的に別ウインドウを移動したりしないといけません。 おそらく「何かによって再描画させられれば」出来ると思うのですが それはどうすれば実現できるのでしょうか? また、これより もっと「こっちの方がいい」といった方法はありますでしょうか?

  • VBA ユーザーフォームの×ボタン制御の不具合

    PowerPoint VBAで複数のユーザーフォームからなるVBAマクロを作成しました。 フォーム内の「次へ」「前へ」ボタンでのみ、マクロの実行制御をしているので、途中で右上の×を押されると、想定外エラーが発生します。 そこで、一番下に貼りつけたようなコードを全てのフォームに挿入することで、右上の×が表示されないようにしました。 あくまでフォームにしかコードは埋め込んでいません。 (標準モジュール、クラスには入ってません) ですが、極稀に、「フォームの右上×」ではなく、「PowerPointの右上×」が非表示になってしまう現象が発生します。 いろいろやるうちに再現はするのですが、厳密な再現手順がよくわかりません。 状況と下記ソースから、どこらへんに原因がありそうかアドバイス頂けないでしょうか? 全コードは出せない部分が多いのですが、アドバイスにあたり必要なコードがあれば、別途貼らせて頂きます。 Private Const GWL_STYLE = (-16) Private Const WS_SYSMENU = &H80000 ' ウィンドウに関する情報を返す Private Declare Function GetWindowLong Lib "USER32.dll" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long ' ウィンドウの属性を変更 Private Declare Function SetWindowLong Lib "USER32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long ' Activeなウィンドウのハンドルを取得 Private Declare Function GetActiveWindow Lib "USER32.dll" () As Long ' メニューバーを再描画 Private Declare Function DrawMenuBar Lib "USER32.dll" (ByVal hWnd As Long) As Long ' フォームアクティブ時処理 Private Sub UserForm_Activate() Dim hWnd As Long Dim Wnd_STYLE As Long hWnd = GetActiveWindow() Wnd_STYLE = GetWindowLong(hWnd, GWL_STYLE) Wnd_STYLE = Wnd_STYLE And (Not WS_SYSMENU) SetWindowLong hWnd, GWL_STYLE, Wnd_STYLE DrawMenuBar hWnd End Sub

  • デスクトップをサブクラス

    デスクトップ以外のサブクラスなら何度もやったことがあります。 DLLを使わずにデスクトップをサブクラスにできますか? DLLを使わずにデスクトップをサブクラス化しようとしたけど、 サブクラスの対象がデスクトップだと特殊なのか、 サブクラスにできていないみたいでした。 MessageBeep(0xFFFFFFFF); が実行されなかったからそう思いました。 FARPROC Org_Proc; LRESULT CALLBACK DeskProc(HWND, UINT, WPARAM, LPARAM); OrgProc = (FARPROC)GetWindowLong(HWND_DESKTOP, GWL_WNDPROC); SetWindowLong(HWND_DESKTOP, GWL_WNDPROC, (LONG)DeskProc); LRESULT CALLBACK DeskProc(HWND hWnd, UINT msg, WPARAM wp, LPARAM lp) {  if(msg == WM_LBUTTONDOWN)MessageBeep(0xFFFFFFFF);  return CallWindowProc((WNDPROC)Org_Proc, hWnd, msg, wp, lp); }

  • win32 GetWindowLong

    GetWindowLongで別のプログラムのウインドウハンドルを取得してウィンドウプロシージャのアドレスを調べようと思ったのですが取得できません。他のウィンドウのウィンドウプロシージャのアドレスは取得できないのでしょうか? ------------------------------------------ #include <stdio.h> #include <string.h> #include <windows.h> struct cell{ HWND hWnd; char WindowName[256]; }; BOOL CALLBACK EnumWndProc( HWND hWnd, LPARAM lParam ) { char buff[256]=""; GetWindowText( hWnd,buff, sizeof(buff));//ウインドウの文字を取得して、 if(strcmp(buff,((cell*)lParam)->WindowName)==0){//名前が一致したら、 ((cell*)lParam)->hWnd = hWnd;//ウィンドウハンドルを渡す } return true; } int main(int argc, char* argv[]) { cell c; c.hWnd =NULL; strcpy(c.WindowName,"無題 - メモ帳");//検索するウィンドウの名前 EnumWindows( EnumWndProc, (LPARAM)&c); LONG wndproc, exstyle; if(c.hWnd != NULL){ //目的のウインドウハンドルが取得できました wndproc = GetWindowLong(c.hWnd, GWL_WNDPROC); //メモ帳のウィンドウプロシージャが取得できない exstyle = GetWindowLong(c.hWnd, GWL_EXSTYLE); } return 0; }

  • ExcelVBAでフォームのタイトルバーで右クリックした場合などに閉じるボタンが有効化されないようにするコード

    Excelのプログラムで、最小化ボタンを有効にし、閉じるボタンを無効にする質問をしたんですが、うまくいったと思ったのですがフォームが開き、タイトルバーで右クリックした場合などは閉じるボタンが有効化されてしまうのでこれを無効のままにするコードを教えてください。 作ったプログラムは以下の通りです。 標準モジュール Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _ (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _ (ByVal hWnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function DrawMenuBar Lib "user32" _ (ByVal hWnd As Long) As Long Public Declare Function GetSystemMenu Lib "user32.dll" _ (ByVal hWnd As Long, ByVal bRevert As Long) As Long Public Declare Function EnableMenuItem Lib "user32" _ (ByVal hMenu As Long, ByVal wIDEnableItem As Long, ByVal wEnable As Long) As Long Public Const MF_DISABLED = &H2& Public Const GWL_STYLE = (-16) Public Const WS_MINIMIZEBOX = &H20000 Public Const MF_BYCOMMAND = &H0& Public Const SC_CLOSE = &HF060& Dim hSysMenu As Long UserForm_Initializeプロシージャ Dim fRet As Long Dim hWnd As Long Dim fStyle As Long hWnd = FindWindow("ThunderDFrame", "UserForm1") fStyle = GetWindowLong(hWnd, GWL_STYLE) fStyle = (fStyle Or WS_THICKFRAME Or WS_MINIMIZEBOX) fRet = SetWindowLong(hWnd, GWL_STYLE, fStyle) hSysMenu = GetSystemMenu(hWnd, 0) EnableMenuItem hSysMenu, SC_CLOSE, MF_BYCOMMAND Or MF_DISABLED fRet = DrawMenuBar(hWnd) 回答よろしくお願いします。

専門家に質問してみよう