タイトルの通りなのですが、どうしたらよいでしょうか。
API をつかって、キーの監視とかしてみたんですがダメでした。

できればW2k対応でお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

私もやはりやるべきではないと思うのですが、


参考URLはどうでしょうか。(苦笑)

参考URL:http://www.google.com/search?q=Ctrl+%2B+Alt+%2B+ …
    • good
    • 0

VBはそれほど詳しくないのでハズしているかもしれませんが、


[CTRL]+[ALT]+[DELETE]はWindows OSを制御する上での
最後の手段ですから、無効にさせない方がよろしいのでは
ないかと思いますが。

逆に、なぜ[CTRL]+[ALT]+[DELETE]を無効にしようとして
いるのでしょうか。これが効かなくなると、アプリがハングして
しまった時に、ユーザは電源オフ以外に対処方法がなくなって
しまうので、大変危険ではないかと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qvoid **(char や intのアドレス混在)について

printf("%d",voidd[0]);にてほしい値が表示されません。
どうすればいいですか?
よろしくお願いします。
#include<stdio.h>
int main()
{
/*
Calc.StringExpressionGet("1+((2+34)*2-111*77)*5-67*8/90");
Calc.StringExpressionResolve();
Calc.Print();
*/
int num[3];
num[0]=111;
num[1]=222;
num[2]=333;
char str[4]="ABC";
void **voidd;
voidd=new void*[6];
voidd[0]=(void *)&num[0];
voidd[1]=(void *)&str[0];
voidd[2]=(void *)&num[1];
voidd[3]=(void *)&str[1];
voidd[4]=(void *)&num[2];
voidd[5]=(void *)&str[2];
printf("%d",voidd[0]);
getchar();
return 0;
}

printf("%d",voidd[0]);にてほしい値が表示されません。
どうすればいいですか?
よろしくお願いします。
#include<stdio.h>
int main()
{
/*
Calc.StringExpressionGet("1+((2+34)*2-111*77)*5-67*8/90");
Calc.StringExpressionResolve();
Calc.Print();
*/
int num[3];
num[0]=111;
num[1]=222;
num[2]=333;
char str[4]="ABC";
void **voidd;
voidd=new void*[6];
voidd[0]=(void *)&num[0];
voidd[1]=(void *)&str[0];
voidd[2]=(void *)&num[1];
voidd[3]=(void *)&str[1];
voidd[4]=...続きを読む

Aベストアンサー

No.1です。すみません、間違えました。

*(int*)(voidd[0])

です。

Qフォルダ参照ダイアログAPIをVBAに組み込んだときのESCキー押下

フォルダ参照ダイアログAPIをVBAに組み込み、フォルダ選択画面が表示されたとき、ダイアログ上の「OK」「キャンセル」以外に、キーボードの「ESC」キーを押下すると、VBAの「コードの実行を中止」ダイアログが表示されプログラムの実行が中断します。「ESC」キーを押下しても「キャンセル」と同等の処理で、「コードの実行を中止」ダイアログを表示しないようにできるでしょうか。お知恵をお貸しください。

Aベストアンサー

こんにちは、KenKen_SP です。

> eDi89Uy6さん...

??このように表示されてるのですか^^;

> ダイアログ上の「OK」「キャンセル」以外に、キーボードの「ESC」キーを
> 押下すると、VBAの「コードの実行を中止」ダイアログが表示されプログラム
> の実行が中断します。

ご提示頂いたコードはキャンセル時に初期フォルダのパスをそのまま返すみたい
ですね。 つまり、ShowFolders 関数の呼び出し方次第なのですが、面倒な仕組
です。関数の仕様としてキャンセル時に初期フォルダを返すのって、余り宜しく
ない気がします。

また、CallBack を使っているのに、前回選択のフォルダを記憶してません...

これを修正するのはちょっと面倒なので、私が使っているものを Excel VBA
用に簡略化したものを提示します。ご参考下さい。

ユーザー定義関数 BrowseForFolder で、次の機能を関数化してあります。

 1. フォルダ参照ダイアログを表示
 2. 前回の選択フォルダを記憶(Excel2000以上で機能します)
 3. ユーザーが選択したフォルダの「¥マークで終わるパス」を返す(重要)

この関数は3つ引数を受付ますが、どれも省略可能です。それぞれの意味は、

第1引数:[strCaption] 省略可 ダイアログに表示する文字列
第2引数:[strRootPath] 省略可 初期表示のフォルダ(ルートパス)
     -->初期値「デスクトップ(仮想)」です
第3引数:[blnFixRoot] 省略可 第2引数で指定した初期フォルダより上位
     のディレクトリーに移動可能にするかどうかを True / False で設定

     例)strPath = BrowseForFolder(,"D:\",True)
       --> D:\ が初期フォルダとして表示され、デスクトップまで OK
     例)strPath = BrowseForFolder(,"D:\",False)
       --> D:\ が初期フォルダとして表示され、それより上位は無理

となってます。

キャンセル時の戻り値は「 長さ0の文字列 = vbNullString 」です。

【以下ソースコード】より下の部分を標準モジュールにコピペ
して下さい。ご質問の趣旨であるキャンセル時の処理ですが、ソース一番下に
Sub Sample() に書いておきました。

’【以下ソースコード】---------------------------------------------------

Option Explicit

' フォルダ参照ダイアログ

Private Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" ( _
  lpBrowseInfo As BROWSEINFO _
) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" ( _
  ByVal pidl As Long, _
  ByVal pszPath As String _
) As Long
Private Declare Function ILCreateFromPathA Lib "shell32.dll" Alias "#189" ( _
  ByVal pszPath As String _
) As Long
Private Declare Sub CoTaskMemFree Lib "ole32" (ByVal pv As Long)
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" ( _
   ByVal hwnd As Long, _
   ByVal wMsg As Long, _
   ByVal wParam As Long, _
   ByRef lParam As Any) As Long

' BROWSEINFO構造体
Private Type BROWSEINFO
  hwndOwner   As Long  ' オーナーウインドウのハンドル
  pidlRoot    As Long  ' ルートフォルダ定数
  pszDisplayName As String ' 選択フォルダ名
  lpszTitle   As String ' ダイアログ表示メッセージ
  ulFlags    As Long  ' オプション
  lpfn      As Long  ' CallBack関数アドレス
  lParam     As String ' CallBack関数パラメータ
  iImage     As Long
End Type

Private Const CSIDL_DESKTOP = &H0
Private Const BIF_RETURNONLYFSDIRS = &H1
Private Const WM_USER = &H400
Private Const BFFM_SETSELECTIONA = (WM_USER + 102)
Private Const BFFM_INITIALIZED = 1

Private Const MAX_PATH = 260

' フォルダ参照ダイアログを開いて¥記号で終わるパスを返す
Public Function BrowseForFolder( _
  Optional strCaption As String = "フォルダを指定して下さい", _
  Optional strRootPath As String, _
  Optional blnFixRoot As Boolean) As String

  Dim udtBROWSEINFO As BROWSEINFO
  Dim lngRet    As Long
  Dim strPath    As String
  Static strPrevDir As String

  ' BROWSEINFO構造体を用意
  With udtBROWSEINFO
    .hwndOwner = 0&
    .pidlRoot = CSIDL_DESKTOP
    If strRootPath <> vbNullString Then
      If blnFixRoot Then
        .pidlRoot = ILCreateFromPathA(strRootPath)
      End If
      If Len(strPrevDir) Then
        strPrevDir = strRootPath
      End If
    End If
    .lpszTitle = strCaption
    .ulFlags = BIF_RETURNONLYFSDIRS
    ' Excel97 では AddressOf 演算子が使えないので
    ' 条件付きコンパイルする
    #If VBA6 Then
      .lpfn = GetPointer(AddressOf BrowseCallbackProc)
      If Len(strPrevDir) Then
        .lParam = strPrevDir
      End If
    #End If
  End With
  ' フォルダの参照ダイアログ呼び出し
  lngRet = SHBrowseForFolder(udtBROWSEINFO)
  If lngRet > 0 Then
    strPath = String$(MAX_PATH, vbNullChar)
    Call SHGetPathFromIDList(lngRet, strPath)
    Call CoTaskMemFree(lngRet)
    strPath = Left$(strPath, InStr(strPath, vbNullChar) - 1)
    ' 前回参照フォルダ記憶
    strPrevDir = strPath
    ' 戻り値(パスの終わりに¥を付与)
    If Right$(strPath, 1) <> "\" Then strPath = strPath & "\"
    BrowseForFolder = strPath
  End If

End Function

' CallBack プロシージャのアドレスを返す
Private Function GetPointer(lngAddressOf As Long) As Long
  GetPointer = lngAddressOf
End Function

' BrowseForFolder 関数 Callback プロシージャ
Private Function BrowseCallbackProc( _
  ByVal hwnd As Long, ByVal uMsg As Long, _
  ByVal lParam As Long, ByVal lpData As Long) As Long
  If uMsg = BFFM_INITIALIZED Then
    SendMessage hwnd, BFFM_SETSELECTIONA, 1, ByVal lpData
  End If
End Function


’【以下使い方のサンプルコード】

Sub Sample()

  Dim strPath As String
  
  strPath = BrowseForFolder()   ’<--基本的にはこれだけ
  If strPath = vbNullString Then  ’<--長さ0の文字列ならキャンセル
    MsgBox "キャンセル"
    Exit Sub           ’<--キャンセル時は終了
  End If
  
  ’<--以降の処理を書く-->
  ’取り合えずパスを表示してみる
  MsgBox strPath
  ' 選択されたフォルダにある Sample.xls を開いてみる
  Workbooks.Open Filename:=strPath & "Sample.xls"

End Sub

こんにちは、KenKen_SP です。

> eDi89Uy6さん...

??このように表示されてるのですか^^;

> ダイアログ上の「OK」「キャンセル」以外に、キーボードの「ESC」キーを
> 押下すると、VBAの「コードの実行を中止」ダイアログが表示されプログラム
> の実行が中断します。

ご提示頂いたコードはキャンセル時に初期フォルダのパスをそのまま返すみたい
ですね。 つまり、ShowFolders 関数の呼び出し方次第なのですが、面倒な仕組
です。関数の仕様としてキャンセル時に初期フォルダを返すのって、余り...続きを読む

Qvoid main()って誰が最初?:ANSI-C

ANSI-C言語に関することです。
ベンダー拡張やOS固有機能は除外してください。

よく、書籍でvoid main(void)と書いたサンプルを見かけます。
プログラミング言語Cではint main(void)だし、C言語FAQでも「void main(void)は間違いである」と書いてあるのに…。
過去の質問への回答で「ANSI-Cでは…」と解説している人がいたのでANSI-Cの仕様を調べてもint main(void)の方が正しいように書かれていました。

これだけ資料が揃っているのにいまだにvoid main(void)と書かれた書籍がイッパイあるのはなぜなんでしょう?
最初にvoid main(void)って書いた人がものすごく影響力のある人だったのか?と想像してしまいます。
いったい誰が最初にvoid main(void)と書き始めたのでしょうか?

Aベストアンサー

 昔は『プログラミング言語C』が void main(void) と書いていたからです。

 この本はC言語を開発したDr.KernighanとDr.Ritchieが1978年に発表したものです。
 言語設計者が自ら開発した本として大きな影響力を持ち、「K&R本」と呼ばれて親しまれてきました。

 しかしK&R本の内容では、言語設計として曖昧な部分、不適切な部分もありました。そこで言語設計を洗いなおしたのが1988年のANSI規格です。

 同じころにK&R本もANSI規格に合致するように内容を改定して、『プログラミング言語C 第2版』として再発表されました。

 共立出版から出ている和訳本も、初めは第1版の翻訳でしたが、ANSI以降は第2版の翻訳になっちます。

 しかし我々は、日本語でもそうですが言語習慣というものはなかなか変えられません。だから今でも(コンパイラが許すなら)void main(void)と書く人もいるわけです。

参考URL:http://www.bohyoh.com/CandCPP/C/history.html

 昔は『プログラミング言語C』が void main(void) と書いていたからです。

 この本はC言語を開発したDr.KernighanとDr.Ritchieが1978年に発表したものです。
 言語設計者が自ら開発した本として大きな影響力を持ち、「K&R本」と呼ばれて親しまれてきました。

 しかしK&R本の内容では、言語設計として曖昧な部分、不適切な部分もありました。そこで言語設計を洗いなおしたのが1988年のANSI規格です。

 同じころにK&R本もANSI規格に合致するように内容を改定して、『プログラミング言語C 第2版』と...続きを読む

QMDI親フォームでキー入力を監視する。

MDIを使っていて、何らかの子フォームが常に開いている状態で、親フォーム側でキー入力を監視する事は可能でしょうか?
子フォーム側でキー入力を監視するのは避けたいので...
どなたかお教えください。

Aベストアンサー

WithEventsで出来るでしょう

Private WithEvents f As Form

Private Sub f_KeyPress(KeyAscii As Integer)
MsgBox KeyAscii
End Sub

Private Sub MDIForm_Load()
Set f = New Form1
f.Show
f.KeyPreview = True
End Sub

Qvoid*型の配列について

void* a[2];
void* b = a;
void* c[2] = (void *[2])b;

error C2440: '型キャスト' : 'void *' から 'void *[2]' に変換できません。
配列型への変換はありませんが、参照またはポインタから配列への変換があります。

void*型にした a を再度void*型の配列に戻すにはどのように記述すればよいでしょうか?

環境はXP(SP3)のVS2008 MFC です。

宜しくお願いいたします。

Aベストアンサー

void* a[2];
void* b;
void* (*c)[2];

b = (void*)a;
c = (void* (*)[2])b;

ってことですか?

Qチェックボックスのキーダウン時に矢印キーを検知する方法について

チェックボックスのキーダウン時に矢印キーを検知する方法について

VB6のチェックボックスについて質問させて頂きます。

環境
  Windows 2000 SP4
  Visual Basic 6.0(SP6)

チェックボックスのキーダウン時に矢印キーを検知する方法について、ご存知の方がいらっしゃいましたら、ぜひ教えて頂きたいです。

自分なりに調べてみた結果は以下の通りです。

チェックボックスのKeyDownイベントでは矢印キーは検知できませんでした。

次に試したのが、サブクラス化を行い、WM_KEYDOWNを取得する方法です。

正直、サブクラス化を行えば矢印キーを確実に検知できると考えていたのですが、なぜか矢印キーを押してもWM_KEYDOWNメッセージを取得できず、このため矢印キーの検知ができませんでした。
矢印キー以外のキー、例えばAやSなどは問題なく検知できました。

ちなみに、この状態でSpy++を起動し、矢印キーを押したときのメッセージを確認してみると、チェックボックスウィンドウはきちんとWM_KEYDOWNを受け取っていました。
それなのにサブクラス化した方ではWM_KEYDOWNは取得できません。

まだ完全にサブクラス化の概念を理解している訳ではないため、恐らく何か原因があるのでしょうが、想像ができないでいます。
( Windowsから送られるメッセージがチェックボックスウィンドウに届くまでの間に誰がメッセージを処理してるのかが分かりません。自分は間に何もないと考えていました )。

この動作についても知っている方がいたら、説明して頂けるととても助かります。

すいませんが、ご教授お願い致します。

チェックボックスのキーダウン時に矢印キーを検知する方法について

VB6のチェックボックスについて質問させて頂きます。

環境
  Windows 2000 SP4
  Visual Basic 6.0(SP6)

チェックボックスのキーダウン時に矢印キーを検知する方法について、ご存知の方がいらっしゃいましたら、ぜひ教えて頂きたいです。

自分なりに調べてみた結果は以下の通りです。

チェックボックスのKeyDownイベントでは矢印キーは検知できませんでした。

次に試したのが、サブクラス化を行い、WM_KEYDOWNを取得する...続きを読む

Aベストアンサー

APIで自力でチェックボックスを作成すると、KeyDownが取得できます。
その結果からVB製のチェックボックスは、VBのライブラリ中で、自前サブクラス関数より先にメッセージを捕まえ、カーソルキーであればフォーカス制御の処理を行って、メッセージを破棄していることが予想できます。
破棄されたメッセージは、捕まえようがありません。

なのでVBより先にメッセージを得るために、フックしてあげないとできないのではないかな?


下に、APIでCheckBoxを作成する方法を載せておきます。
値の変更処理とかを追加しないと、OnOffが切り替わりません。
質問者さんのサンプルに、コードの変更と追加です。


モジュール追加で以下
Option Explicit

Private Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal HINSTANCE As Long, lpParam As Any) As Long
Private Declare Function DestroyWindow Lib "user32" (ByVal hWnd As Long) As Long

Private Const BS_CHECKBOX = &H2&
Private Const WS_CHILD = &H40000000
Private Const WS_VISIBLE = &H10000000

Public Sub CreChk(Owner As Form)
  Dim hChk  As Long
  hChk = CreateWindowEx(0, "Button", "チェックボックス", _
      WS_CHILD Or WS_VISIBLE Or BS_CHECKBOX, _
      0, 0, 150, 30, Owner.hWnd, 0&, App.HINSTANCE, 0&)
  Call SubClass(hChk)
End Sub



あとそちらのサンプルの関数「WindowProc」をちょっと改造
Select Case uMsg
  Case WM_KEYDOWN
    Debug.Print Now & "KeyDown : KeyCode( " & wParam & " )"
  Case WM_DESTROY
    Call UnSubClass(hWnd)
End Select


呼び出しはフォームLoadで
Call CreChk(Me)
Unload時は不要
サブクラス関数内で、勝手に破棄

APIで自力でチェックボックスを作成すると、KeyDownが取得できます。
その結果からVB製のチェックボックスは、VBのライブラリ中で、自前サブクラス関数より先にメッセージを捕まえ、カーソルキーであればフォーカス制御の処理を行って、メッセージを破棄していることが予想できます。
破棄されたメッセージは、捕まえようがありません。

なのでVBより先にメッセージを得るために、フックしてあげないとできないのではないかな?


下に、APIでCheckBoxを作成する方法を載せておきます。
値の変更処理とか...続きを読む

Qc言語 引数のvoidについて

/*sample01.c*/
void f(void);
void f(void){
}

/*sample02.c*/
void f(void);
void f(){
}

sample02.cの方で関数fの引数のvoidを省略できるのはなぜですか?
コンパイラはDev-C++ Version4.9.9.2
OSはWindowsXPです。
よろしくおねがいします。

Aベストアンサー

> sample02.cの方で関数fの引数のvoidを省略できるのはなぜですか?

長いので規格を引用するのはやめますが、二つの関数型が適合するための条件を満たしているからです。JIS X3010:2003 6.7.5.3 関数宣言子(関数原型を含む)を参照してください。p89~p90にかけての記述がこれに該当します。

Q画像を上キーで小さく、下キーで大きくする

この前、お世話になった小4のKunpaです。
 前回で質問した、RPGについてですが、実を言うと、ほぼ3D感覚のゲームを
作ろうとしています。
その為には、最前面と、画像を大きくしたり、小さくしたりして、遠近感を
出さなければなりません。その為、上キーを押したら、前に進むため、
キャラの向きを奥にし、それを小さくしなければなりません。
そのやり方を教えていただければいいのですが・・・
まだVBやり始めなので、よろしくお願いします。

Aベストアンサー

いいんですよ。ゆっくり一つ一つ確実にスキルアップを計りましょう。
言語習得だけがスキルアップだと思いません。
CGの知識や、多くのゲームに触れることも開発に大きな影響を与えます。

そうですか。PaintPicture 未経験でしたか。。。
以前にサンプルを載せておりますので、そちらを参考にしてみてらいいと思います。画像の比率変更もおこなっています。

すぐに返事を出さないでいいですよ。着実に習得していきましょう。
もう、ここの書き込みはσ( ̄ー ̄ ボクしかもう見ていないでしょうね。(笑)

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=157508

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

QVBでWININET API

こんばんわ。VBでWININET APIを使用してIEのインターネットオプションの設定を変える方法はあるのでしょうか。APIを使わなくてもいい方法があるのでしたらそれでも構いません。インターネットオプションの設定が変えれればいいので。宜しくお願い致します。

Aベストアンサー

なるほどーそういうことですかー
勘違いしてました。
それならば大まかに予想がつきます。
レジストリエディタで
HKEY_CURRENT_USER
SoftWare
Microsoft
Internet Explorer
の中を操作してあげれば可能だと思います。

この中の情報は公開されてないと思うので、自分でインターネットオプションを変更しながら、どこがどのように変わるのかを調査する必要があると思います。

後はレジストリの変更を
VBの機能を使うなら SaveSetting
APIなら RegCreateKeyEx
で、かければよいと思います。


人気Q&Aランキング

おすすめ情報