質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

424閲覧

WinAPI アクセラレータキー Ctrl+

Weapon

総合スコア106

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/11/26 05:50

前提・実現したいこと

WinAPIのアクセラレータキーでCtrl + Vを作成しようとしましたが以下のように記述してもShift + Vでしか反応しません.なにが問題なのでしょうか

該当のソースコード

C

1#define UNICODE 2 3#include <windows.h> 4 5#define ID_PASTE 10001 6 7LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 8 9int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpszCmdLine, int nCmdShow) 10{ 11 UNREFERENCED_PARAMETER(hPrevInstance); 12 UNREFERENCED_PARAMETER(lpszCmdLine); 13 14 wchar_t CLASS_NAME[] = L"sample"; 15 16 WNDCLASSEX wc = { 17 sizeof(WNDCLASSEX),CS_VREDRAW | CS_HREDRAW, WindowProc, 18 0, 0, hInstance, 19 NULL, (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED),(HBRUSH)GetStockObject(WHITE_BRUSH), 20 NULL, CLASS_NAME, NULL 21 }; 22 23 RegisterClassEx(&wc); 24 25 HWND hwnd = CreateWindowEx( 26 0, CLASS_NAME, L"Sample", WS_OVERLAPPEDWINDOW, 27 CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 28 NULL, NULL, hInstance, NULL); 29 if (hwnd == NULL)return 0; 30 31 static ACCEL accel; 32 accel.key = 0x56; 33 accel.cmd = ID_PASTE; 34 accel.fVirt = FCONTROL; 35 36 HACCEL haccel = CreateAcceleratorTable(&accel, 1); 37 38 ShowWindow(hwnd, nCmdShow); 39 UpdateWindow(hwnd); 40 41 MSG msg = {}; 42 while (GetMessage(&msg, NULL, 0, 0) > 0) { 43 if (!TranslateAccelerator(hwnd, haccel, &msg)) { 44 TranslateMessage(&msg); 45 DispatchMessage(&msg); 46 } 47 } 48 49 DestroyAcceleratorTable(haccel); 50 51 return (int)msg.wParam; 52} 53 54LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 55{ 56 switch (uMsg) { 57 case WM_CREATE: 58 break; 59 case WM_COMMAND: 60 MessageBox(hwnd, L"GetMessage COMMAND", L"ALERT", MB_OK); 61 break; 62 63 case WM_DESTROY: 64 PostQuitMessage(0); 65 return 0; 66 67 default: 68 break; 69 } 70 71 return DefWindowProc(hwnd, uMsg, wParam, lParam); 72} 73

補足情報

Windows10 Pro
VisualStudio2017 Community

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

動作未検証ですが、以下にて動作しないでしょうか?
仮想キー指定FVIRTKEYフラグが必要だったかと思います。
また、念のため戻り値チェックしたほうがよいです。

C++

1ACCEL accel[1]; // 配列として用意 2accel[0].key = 0x56; // V 3accel[0].cmd = ID_PASTE; 4accel[0].fVirt = FCONTROL | FVIRTKEY; // FVIRTKEY=仮想キー 5HACCEL haccel = CreateAcceleratorTable(&accel, 1); 6if(haccel != NULL){ 7 DWORD dwErr = GetLastError(); 8 // 何らかのエラー処理 9}

投稿2018/11/26 06:24

can110

総合スコア38266

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Weapon

2018/11/26 06:45

FVIRTTKEYを追加することで解決しました. もう一つお聞きします. 一応配列としてではなくても動きましたが配列として用意することが仕様なのでしょうか?
can110

2018/11/26 07:03

マニュアルに「アクセラレータテーブルを記述する ACCEL 構造体の配列へのポインタを指定します。」とあるので一応は仕様です。実質1個なら配列じゃなくてもよいですが。
SaitoAtsushi

2018/11/26 07:24

オブジェクトは、長さ 1 の (そのオブジェクトの型の) 配列と同じメモリレイアウトを持つことが言語仕様で保証されています。 なので、どちらでも良いはずです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問